mysql - SQL 一对多关系,但是多对一表关系

标签 mysql sql database foreign-keys

我有 5 个可以包含电话字段的表,但我希望每个表都可以选择多个电话号码。

创建一个子表并将其链接到其他 5 个“父”表更有意义,而不是创建 5 个子表。但现在我正在考虑如何将该表链接到其他 5 个表。

我的第一个想法是过滤 2 个主题。一个存储链接表名称的字段,以及一个包含五个表之一的键的通用外键。我还是偏向这个方向。

接下来的想法是将 5 个外键放入表中,并允许它们为空。我不喜欢 4 个空字段的想法。更不用说我对另一个表也有同样的问题,该表将以类似的方式链接到其他 11 个表。

第三个是一个链接表或联结表,同样(我相信)具有 5 个可为空的外键,但这似乎并没有比选项 2 做更多的事情,但复杂性更高一些。

第四个选项,我对大多数表的主键使用自动增量字段。我可以为这些表切换到 UUID 或 GUID。出于安全原因,我已经设置为使用 UUID 作为主要数据,但为了性能而对大多数表使用自动增量。

我遇到了第五个选项,其中将自动增量字段与表名称组合以创建新的字符字段。 (仅在创建表期间,因此从技术上讲不是计算字段。)但除了第一个选项之外,再一次看不到这样做的好处。

其中一个是最好的方法吗,还是还有另一个我错过或不理解的选择?

最佳答案

如果您想将相同的电话号码分配给三个记录(形成您的 5 个表格),是否要将具有相同电话号码的三个记录添加到您的“phone_numbers”表格中?

这是一个优化问题,因此在 SQL 语义意义上没有“好方法”。

我认为在开发中最容易使用的是第一种方式:表中的table_nameid,但不要使用varchar。使用枚举或“table_name_id”TINYINT(引用第二个带有名称的表)。

关于mysql - SQL 一对多关系,但是多对一表关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32926925/

相关文章:

java - 将数据插入MYSQL数据库

mysql - 如何为 Zend FrameWork 格式化 Mysql 查询?

php - 根据查询结果在 html 表中生成复选框

mysql - 如何从基于其他 3 个表的表中选择数据?

c# - 使用 .mdf 数据库发布 ASP.NET 项目

sql - 使用多个线程更新同一个数据库会更快吗?

php mysql - 获取产品的产品缩略图

sql - 用 Haskell 表示电路

sql - phpMyAdmin 和 latin1_swedish_ci

mysql - 数据库输入副本