我想知道表示用户设置的最佳方式是什么,该用户设置既可以从集合中获取值(例如“高”、“中”或“低”),也可以是来自另一个(或相同!)的 ID 列表表(多对多关系)。
我想知道常用的是什么以及每个解决方案的缺点/资产是什么(在性能、完整性和可持续性方面)。
我想知道表示用户设置的最佳方式是什么,该用户设置既可以从集合中获取值(例如“高”、“中”或“低”),也可以是来自另一个(或相同!)的 ID 列表表(多对多关系)。
我想知道常用的是什么以及每个解决方案的缺点/资产是什么(在性能、完整性和可持续性方面)。
在某种程度上,任何解决方案都将在很大程度上取决于您在做什么以及您使用的 RDBMS。一般来说,尽管使用文本字段存储逗号分隔的整数列表是个坏主意。
起点解决方案始终是基于 id 的引用。这是一个很好的起点,因为它遵循适当的关系规则,并且它允许您通过将这些值分解为新的关系来处理诸如多个值之类的事情。事实上,我会说从这里开始总是最好的。
然而,备选方案在某些情况下和某些 RDBMS 上运行良好。如果您永远不需要删除选项,ENUM 字段(或者带有检查以将它们保持在某些值范围内的文本域)很有用。如果这样做,那么在删除它们之前,您必须确定要对此做些什么。其次,数组类型在某些情况下也很有用(如果数组作为一个整体是域的原子值,它们不一定会破坏 1NF,例如,如果我们将 IPv4 地址表示为 4 个 8 位整数的数组). 基于数组的方法在很大程度上取决于你在做什么和数据库级支持,但在 PostgreSQL 上,我会选择一个数组,其中基数很重要(即数组是一个元组而不是一个集合),并且语义是完全独立的.
你没有给我们太多的工作,“其他表”是关于什么的?让我们假设它现在是自定义优先级。
为了能够在多种类型上设置外键,您需要使用Table Inheritance。将有一个主表,两种类型都从它“继承”,使用相同的主键字段。
有几种表继承。单表继承使用空值,但要简单得多。类表继承是规范化的,但更痛苦。
“异或配对列”解决方案
该解决方案包含两个协同工作的列:
如果前者的值为“高”、“中”或“低”,应用程序将仅采用该值而后者将被忽略。另一方面,如果它为 NULL,则将使用 M2M 关系。