结合MySQL数据表是最佳实践吗?

时间:2013-01-08 22:19:49

标签: mysql database database-design

我正在考虑更改数据库方案以减少表的数量。我有几个表包含不同但相似的数据,我想知道最好的做法是这样做,还是将它们组合在一起会很复杂。

例如,假设我有以下两个表:

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复杂化。

如果这是一个重复的问题,我很抱歉,这似乎是一个很难查找的主题,因为我没有提出关于选择数据的常见问题,而是该方案。

4 个答案:

答案 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)

我认为没有任何理由将表合并到一个表中。

我要考虑的一件事是使用enum列。如果您的列是引用status的外键,请将它们设为枚举。然后你可以完全免除桌子。这导致更简单的模式。但是,它有一些弱点(有些甚至称之为evil);例如,如果您在多个地方使用相同的枚举,则无法保证所有定义都相同,并且存在随着数据库的发展而变得不同步的风险。尽管如此,我们在我们的架构中使用了它们,并且没有真正感受到任何痛苦。