mysql - 如果需要多个约束,是否需要为每列使用单独的外键表?

标签 mysql sql database foreign-keys innodb

我有一个包含 20 列的 MySQL INNOB 表,我想向大约 10 列添加外键约束。

我知道我可以使用外键数据创建 10 个单独的表,然后将它们作为约束添加到初始表 - 这是可能的,而且我之前已经这样做过。

问题 - 这将导致 10 个额外的表。是否可以将这 10 个表(带有外键数据)合并为 1 个表,然后引用该表/列作为约束?

我问是因为我可以看到我的数据库最终有很多外键表。

最佳答案

理论上你可以使用一个表,但这将是一个非常糟糕的设计,因为它不会为每种唯一的数据类型提供一个简单的枚举“域”,并且它会为所有数据的每个唯一组合乘以每个值表中的其他列,或者换句话说,大约为每列平均元素数的 10 次方。

具体来说,如果每列只有 5 个唯一值,并且有 10 列,那么将生成一个包含 9,765,625 条记录的表!我相信您会发现这效率非常低!

这种数据乘法对于防止列中出现无关的 NULL 或空字符串值是必要的,这会破坏您的外键关系。

为每个唯一的数据集创建一个不同的“域表”是很常见的,如果您的数据库中只有其中 10 个,那就相当“轻”了。

如果您不希望每个约束都使用域表,则可以始终使用 ENUM('value1', 'value2', ...) 作为列数据类型,而不是外部数据类型键(不需要您创建任何其他表)。

关于mysql - 如果需要多个约束,是否需要为每列使用单独的外键表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16764698/

相关文章:

java - 使用liquibase迁移数据

MySQL 按总和分组

mysql - 无法将 Bignum 转换为字符串

php - 如何使用 PHP/MySQL 跟踪图像/横幅点击/查看

MySQL 打印函数内变量的值

SQL Server 索引 - LIKE 查询的任何改进?

php - 我如何在 php foreach 循环中将所选值列为所选值并将其他值列为列表

mysql - 奇怪的 1264 超出范围错误

python - Flask sqlalchemy 更新限制

mysql - 如何在单个 SQL 查询中搜索列中的值并获取列的计数