我有一个复杂的对象要存储在数据库中。
我觉得对于我想限制可能值的每种情况,我应该将值存储在表中并具有外键约束。我觉得这会比拥有 ENUM 更灵活。
问题是在很多情况下我想限制值。(数据也有分支,在某些情况下我会在不同的地方加入一个表)
因此,每次获得货币价值、计量单位等时,我都必须加入 - 以指数方式增加加入的数量。
您对此有何建议?
编辑:
我可以使用可能有 15-20 种不同类型的连接,大约 3 级深
我有一个复杂的对象要存储在数据库中。
我觉得对于我想限制可能值的每种情况,我应该将值存储在表中并具有外键约束。我觉得这会比拥有 ENUM 更灵活。
问题是在很多情况下我想限制值。(数据也有分支,在某些情况下我会在不同的地方加入一个表)
因此,每次获得货币价值、计量单位等时,我都必须加入 - 以指数方式增加加入的数量。
您对此有何建议?
编辑:
我可以使用可能有 15-20 种不同类型的连接,大约 3 级深
我看到了实现约束的三种可能方法:
可以将任何真正的分类变量存储在单独的表中,并在每次引用时都有一个指向该表的外键。在许多情况下,这可以帮助保持数据库更清洁和更易于维护。知道您的用户的“状态”属性是 1 到 50 之间的数字变量,而不是可能是“MA”、“ma”、“Mass.”或“Massachusetts”的字符串,肯定会让您的 DBA(和开发人员因此,最终用户)很高兴。
但是,如果您的变量不是真正的分类变量,但有一些关于它的特定标准,您可以使用CHECK 约束(此处为MySQL 详细信息)强加它们。这些允许您定义一定范围内的有效值,而不必枚举每个可能的值,如果您只想检查插入时的有效性而不产生外键查找的惩罚,这可能会很有帮助。
最后,在业务逻辑中肯定有约束的地方。我发现复杂的约束(正则表达式匹配等)最好在应用程序代码中维护,而不是在 SQL 数据库中。
请注意,外键不一定会损害性能。您可以运行一些测试,但我发现将大型(500k 行)表连接到小型(20 行)分类表对性能没有明显影响。所以你可能没问题,不用担心。
如果您确实有许多想要 ENUM 的潜在值,请记住,只有在执行连接时才会发生性能损失,这并不总是必要的。通常,对于您的数据检索,您可以只使用 ID,而不是实际值。在这种情况下,外键的存在绝不会影响您的 SELECTS,并且只会对每次 INSERT/UPDATE 产生轻微的惩罚,因为系统需要检查外键是否有效。