如何在数据库中建模一对多关系

时间:2013-11-26 14:52:58

标签: sql database-design

我有一个数据库,其中包含使用外键表示它们之间关系的表。在一个表中我有2列.. 1是id(外键),其他包含friendsids(来自friends表的外键)。

我可以将朋友放在不同的行上:

                 | id   | friendsids |
                 | 1    | 3          |
                 | 1    | 4          |
                 | 1    | 5          |

或将它们打包到一个字符串字段中:

                 | id   | friendsids |
                 | 1    | 3,4,5      |

稍后我将使用PHP explode()分隔朋友。还记得我有很多记录。哪种方式更有效,为什么?

提前致谢。

3 个答案:

答案 0 :(得分:3)

数据库规范化规则规定您在1字段中只有1值。这样您就可以使用正确的主键访问任何单个值,而不必使用一些丑陋的代码来拆分返回的字符串。

无论何时设计数据库,都应始终牢记规范化规则。 Here是维基百科文章的链接。

万一你忘了:

  

钥匙,整个钥匙,只有钥匙 - 所以帮助我Codd。

答案 1 :(得分:2)

忘记在PHP中拆分。你正在做的是一个所谓的映射表,它应该是1:1。这允许你

  • 轻松INSERT IGNORE添加映射,无需检查它是否已存在,
  • 轻松删除映射,无需检查它是否已存在,
  • 轻松计算(*)朋友数量,
  • 轻松加入复杂查询的数据
  • 使用跨越两行的UNIQUE-INDEX以及后者的非唯一来快速搜索您的数据
  • 将数字保存为数字而不是字符串,以节省大量的ram和磁盘i / o

并且可能更多。

答案 2 :(得分:0)

如前所述,选项之一是走的路,不了解性能,选项1已经在如此多的数据库中有效地工作了很多年..

请记住将正确的索引放在正确的表格上,你就可以了。

SQL用于处理大量数据