SQL一对多关系,但多对一表关系

时间:2015-10-03 20:01:43

标签: mysql sql database foreign-keys

我有5个可以包含电话字段的表格,但我想为每个表格选择多个电话号码。

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

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

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

第三个是链接或联结表,再次(我相信),有5个可以为空的外键,但这似乎没有做任何比选项2更复杂的事情。

第4个选项,我正在为大多数表使用主键的自动增量字段。我可以切换到这些表的UUID或GUID。出于安全原因,我已经将UUID设置为主要用户,但是为了提高性能,大多数表都使用了自动增量。

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

其中一种是最好的方式,还是有其他选择我要么错过了,要么不明白?

2 个答案:

答案 0 :(得分:0)

如果您想将相同的电话号码分配给三个记录(从5个表格中分配),您是否希望将三个具有相同电话号码的记录添加到您的" phone_numbers"表

这是一个优化问题,所以没有好的方法"在SQL语义学意义上。

在我看来,最容易在开发中使用的是第一种方式:此表中的 table_name id ,但不要使用varchar。使用enum或" table_name_id" TINYINT(引用带名字的第二个表)。

答案 1 :(得分:0)

不要让它变得如此复杂而你可以轻松地做到这一点 您可以使用单个表格执行此操作。我给你一个例子如下:

UserId | PhoneNo | PhoneType |的ParentId

其中UserId:是用户的ID 电话号码是原始电话/手机号码 PhoneType:手机/手机号码 父ID:这里是主要的关键点,默认情况下它是0,将其视为一个单独的条目,其他相同的tabl的UserID将其识别为子电话号码。将其视为树关系船.. 据我所知,这是一种简单而有效的方法。