我正在考虑更改数据库方案以减少表的数量。我有几个表包含不同但相似的数据,我想知道最好的做法是这样做,还是将它们组合在一起会很复杂。
例如,假设我有以下两个表:
Table `status`
`status_id` | `status_text`
---------------------------
1 | Open
2 | Closed
3 | On Hold
Table `type`
`type_id` | `type_text`
---------------------------
1 | Regular Work
2 | Advanced Work
3 | Warranty Work
将这些组合成表格是否有利,例如以下内容?
Table `text`
`id` | `type` | `text`
-------------------------------------------
1 | 1 | Open
2 | 1 | Closed
3 | 1 | On Hold
1 | 2 | Regular Work
2 | 2 | Advanced Work
3 | 2 | Warranty Work
type
列将与表示数据集类型的PHP常量相关联。
我目前在这个确切的方案中可能有6个数据表。它只是让我觉得它们非常相似,每个只有2-5行。我真的想像上面那样把它们结合起来,但我不确定它是否会出现并发症,或者它是否打破了最佳实践。
我确实认为id
列会发生冲突,并且不会成为主键的候选列,但它会与type
一起成为唯一键以防止冲突。我并不担心auto_increment,因为这些表是手动管理的。
另外要记住的是,这些表涉及多个JOINS。除了在ON子句中再添加一个条件之外,我认为它不会使JOIN复杂化。
如果这是一个重复的问题,我很抱歉,这似乎是一个很难查找的主题,因为我没有提出关于选择数据的常见问题,而是该方案。
答案 0 :(得分:4)
没有。这不行。你正在倒退适当的数据库设计/规范化,并且不必要地混淆你的数据。
当然你可以这样做,但你会后悔在将来的某些时候做这件事。你真的想要提出一个类似的问题:“嘿Demonslay335,文本类型表中的这种工作类型是什么文本类型?你能为我输入吗?Typey-type type type。”
说足够多的时间会把它变成乱码,就像对数据进行元输入一样。
答案 1 :(得分:1)
如果您有不同的约束,则应使用单独的表,即使数据“看起来”相似。
例如,如果查找表是分开的,您可以非常自然地为不同的引用表定义FOREIGN KEY。
如果将所有内容放在同一个表中,那就更难了。纯粹的声明方式是沿着FK迁移type
,然后在引用表中使用CHECK以确保正确的类型。不幸的是,MySQL不强制执行CHECK,因此您需要通过触发器或(上帝禁止)应用程序逻辑来强制执行正确的类型。
答案 2 :(得分:0)
有利有弊,通常归结为个人偏好。我个人更喜欢多个不同的查找表(因为每个查找表对应于我的域中的不同实体定义,尽管由相似的原始类型组成)。其他人有时更喜欢单一的“超级查询”表,原因就在于你所说的。
我经常看到的一种方法是拥有这样的东西:
LookUp
----------
ID
LookUpTypeID
Value
DisplayText
etc.
LookUpType
----------
ID
Name
这提供了一种将查找值组织到单个结构中的相当简单的方法。如果您发现自己想要分离出类型以“模仿”不同的表格(例如,如果像我这样的开发人员加入您的团队并产生很多噪音),您始终可以根据类型和用途创建视图那些在查询中。
多个小表没有任何内在错误。如果他们真正包含的数据意味着不同的东西,那么我认为它应该是分开的。域中实体的概念含义远比它们组成的数据类型更重要。
多个小表对数据库引擎几乎没有什么影响。这是非常优化的,你没有通过组合表来做任何好处。实际上,您可能会发现随着时间的推移,您的查询会变得稍微迟钝。从数据库中查询的数据的含义开始被表中的实现细节蒙上阴影。您可以通过添加视图来缓解,以便在逻辑上再次分离数据,但如果您发现自己需要这样做,那么为什么要首先将它合并?
答案 3 :(得分:0)