MySQL 中的多行以逗号分隔的列设计

Multiple rows vs comma seperated column design in MySQL

我有一个 table,我需要按如下方式添加行:

id  | empid  | manager | page
------------------------------
1   | emp001 | mg001   | page1
2   | emp001 | mg001   | page2
3   | emp001 | mg002   | page1

所以我很困惑是像上面那样使用,还是应该使用逗号分隔,

id  | empid   | manager | page
--------------------------------- 
1   | emp001  | mg001   | page1,page2,page3,page4.....    
2   | emp001  | mg002   | page2,page10,page5,.....

如果我选择选项 1,我觉得行数不断增加并且 empidmangerid 可以重复。但是,如果我选择选项 2,那么我觉得它不是规范化的形式。

谁能建议哪个是更好的解决方案,为什么?

YMMV 取决于确切的用例,但根据经验 - 保持数据库规范化(或者至少,不要违反 1NF,如第二个选项所建议的!)所以你可以 query/update 很轻松。建立数据库是为了存储行并有效地查询它们,除非你有一个 redonculous(阅读:类似于 facebook)的行数,否则不要试图重新发明轮子。

增加行数没有错。关系数据库最适合规范化数据,您可以使用索引在 table 秒之间执行有效的 JOIN 操作,前提是您已经创建了索引。

因此,选项 1 中提出的方法实际上是让您的数据达到 1NF(第一范式)要好得多,并且将来不会像选项 2 那样对您不利。

如果将来您可能会想出按页面分析员工及其经理的想法,这就是选项 2 的问题。

作为附加说明,我认为您可以通过添加额外的 table 来存储员工和经理字符串并仅通过整数列引用它们来降低列所需的存储空间并停止重复自己。至于 pages 列,我发现附加 "page" 部分使列值看起来像 "pageX" 是多余的。列名已经告诉您它由页面值组成,因此整数列 X 在这种情况下也足够了。

我发现以下架构是一个好的开始:

  • 员工 table 将他们的 ID 存储为整数,名称存储为文本
  • 经理 table 管理类似于员工 table
  • Employees_Managers junction table 存储其 id,Employees.ID 和 Managers.ID 的外键以及整数类型的页面