<select>对于具有复合键的实体-需要策略

时间:2018-07-17 18:21:21

标签: sql forms database-design webforms relational-database

可以这么说,我有保存区域独立信息的数据库表游览(PK tour_id)和包含区域特定信息的tours_regional_details(PK tour_id,region_id)。 假设我要用tours_regional_details表中的实体填充选择控件(我的实际场景有些不同,为简单起见,请想象一下)。 那么,您将如何解决呢?我的胆量说,将PK连接到分隔的字符串中,例如“ pk1 | pk2”或“ pk1,pk2”,并将其用作选择控件的值。在工作时,感觉很脏,可能需要其他验证步骤才能再次拆分字符串,这又使您感到脏。 我不想发动复合vs单pk的圣战,但这对我而言可能是一个错误的数据库设计决定吗?我一直认为识别关系和组合键是有原因的,但是我很想更改我的表,并用自动增量ID和唯一约束填充它们。我只是不确定会带来什么样的新鲜地狱。 这么多年后我第一次遇到这个让我有些惊讶。 编辑:是的,有一个表区域(PK region_id),但是与主题无关。尽管在某些情况下,两个选择框是有意义的,但在这里说它们没有用,假设我只想要一个选择框,并希望从中选择: 假人游览(区域1) 假人游览(2区) 另一个虚拟游览(区域3) ...

1 个答案:

答案 0 :(得分:2)

复合主键并不是数据库设计的问题。在理想的情况下,我们的编程语言和UI库将元组和关系作为一等值支持,因此您可以在下拉控件中分配一对值作为选项的值。但是,由于它们通常仅支持标量变量,因此我们一直在尝试编码或减少标识符。

您当然可以向每个表添加代理键/自动增量列(以及在可用的自然键上的唯一约束)。这是一种非常常见的模式,我见过的大多数数据库至少都有一些这样设置的表。您可能可以保持现有的组合外键不变,或者可能希望/需要更改它们以引用代理主键。

使用代理键作为外键的风险是数据库中的访问路径变得固定。例如,假设tours_regional_details的主键tours_regional_detail_id被另一个表中的外键引用。对另一个表的查询将始终需要与tours_regional_details结合才能获得tour_idregion_id。由于标识符在整个数据库中都可以重复使用,因此自然键可提供更灵活的访问路径。这在从属概念的深入层次结构中变得很重要。这些正是复合键的反对者抱怨键“爆炸”的场景,我至少可以同意在编写查询时记住并在众多列上键入联接变得很麻烦。

您可以将自然键列复制到引用表中,但是存储冗余信息需要额外的精力来保持一致性。由于性能或方便性的原因,我经常将其作为代理键来使用,因为代理键可以查询表而不必执行所有联接来取消引用代理标识符。在这些情况下,最好参考自然键。

如果允许我回到理想的世界,也许DBMS可以允许命名和存储联接。

在实践中,代理键有助于平衡我们必须处理的复杂性。使用它们,但不要崇拜它们。