MySQL通过外键限制

时间:2012-04-19 21:34:25

标签: mysql database join enums foreign-keys

我有一个复杂的对象,我试图存储在数据库中。

我觉得,对于我想限制可能值的每种情况,我都应该在表上存储值并具有外键约束。我觉得这比ENUM更灵活。

问题是在很多情况下我想限制值。 (数据也分支出来,有些情况下我会在不同的地方加入一张桌子)

因此,每当我获得货币价值,计量单位等时,我都必须加入 - 以指数方式增加联接数量。

您对此有何建议?

修改

我可以使用15-20种不同类型的连接,有3层深度

1 个答案:

答案 0 :(得分:1)

我看到了实现约束的三种可能方法:

可以将一个真实的categorical variable存储在一个单独的表中,并在引用时指向该表的外键。在许多情况下,这可以帮助保持数据库更清洁,更容易维护。知道用户的“State”属性是1到50之间的数字变量,而不是可能是“MA”,“ma”,“Mass。”或“Massachusetts”的字符串,肯定会保留您的DBA(和开发人员)因此,最终用户感到高兴。

但是,如果您的变量不是真正的分类,但有一些特定的标准,您可以使用CHECK constraints强加它们(MySQL详细信息here)。这些允许您定义一定范围的有效值,而不必枚举每个可能的值,如果您只想检查插入的有效性而不会导致外键查找的惩罚,这可能会有所帮助。

最后,在业务逻辑中肯定存在约束的地方。我发现复杂的约束(正则表达式匹配等)最好在应用程序代码而不是SQL数据库中维护。

请注意,外键不一定会对性能产生不利影响。您可以运行一些测试,但我发现在大型(500k行)表上执行连接到小型(20行)分类表显示对性能没有明显影响。所以你可能没问题就可以了。

如果您确实有许多想要ENUM的潜在值,请记住只有在进行连接时才会出现性能损失,这并不总是必要的。通常,对于数据检索,您可以只使用ID而不是实际值。在这种情况下,外键的存在决不会影响您的SELECTS,并且只会对每个INSERT / UPDATE产生轻微的惩罚,因为系统需要检查外键是否有效。