MySQL

时间:2016-09-16 10:16:06

标签: php mysql database normalization comma

我有一张表,我需要按如下方式添加行:

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,.....

如果我使用option1,我觉得行数不断增加,empidmangerid可以重复。但是,如果我使用option2,那么我觉得它不是标准化形式。

任何人都可以建议哪种解决方案更好,为什么?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

增加行数没有错。关系数据库最适合使用规范化数据,您可以使用创建它们的索引在表之间执行有效的JOIN操作。

因此,选项1中提供的方法实际上将您的数据提供给1NF(第一范式)更好,并且将来不会像选项2那样咬你。

如果将来您可能会想出每页分析员工及其经理的想法,那么选项2会让您感到厌烦。

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

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

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