我对数据库架构有疑问。
我们正在建立一个CMS。有很多字段会预先填充选择。例如,客户的信用状态可以是“好”,“差”,“未知”或“存款”。该项目的规范是这些预先填充的选择是动态的,管理员可以通过后端添加新值。所以我需要将这些值存储在数据库中。
我正在努力在两种方法之间做出决定
1)为每种列表都有一个表格。示例可以是list_CrediStatus,list_Branches,list_Markets等表。
优点是表格不是很大并且它们彼此分开。因此,一个表上的数据和查询负载可能不会影响其他表?缺点是会有很多。也许30?并且每个表都需要查询。
2)有两张桌子。有一个描述表,您可以在其中定义所有不同的列表名称(list_CreditStatus,list_Branches等)。另一个表包含所有列表的所有值以及将每行链接到描述表中的标识符的外键。
优点是更少的表,1个查询和统一格式。缺点可能在于性能。需要对此表进行大量查询。它将有许多行和大量数据。
有没有人有任何建议?我倾向于选项2.如果这没有意义,请告诉我。写清楚是一个难题。
谢谢, 杰德
答案 0 :(得分:10)
始终将相同的内容保存在一个表中,而不像单独的表中的内容。这意味着你选择选项1.请记住:基于字段名称的表面相似性并不意味着它们就像是一样。
单表解决方案具有诱人的吸引力,因为它看起来更简单,但事实并非如此。保持这些分离所需的代码变得非常复杂。
另外,您无法使用正确的外键。 How do you say一个ORDER有一个列CREDIT_STATUS引用列表表,不允许有人放入血型(或其他)值?
答案 1 :(得分:7)
每种类型我都有一张桌子。为什么?除了其他原因之外,您可能很容易发现这些数据类型逐渐为该类型累积了特别的附加信息。如果所有内容都合并到一个表中,那将非常难以满足。
(免责声明:我在这样一个系统上工作过一个包含月,日,商品类型,真/假(是的!),假日日期等的表。它基本上是一个巨大的杂项抓包,类似于{ {3}})
不要担心每个表的查询。这就是数据库擅长的,我不会太早优化。直到你遇到问题/问题为止。
答案 2 :(得分:2)
你所谈论的是如此糟糕,以至于它实际上有一个名字。它通常被称为反模式 - 一种需要避免的软件开发模式。
我添加了一个链接,使用该术语,您可以找到其他链接。
表很好,参考完整性很好。
在需要时使用两者。
答案 3 :(得分:0)
听起来像你在谈论域限制表,但我可能错了。如果您确实在讨论域约束,那么您希望每个域约束都在其自己的表中。这两个表都是可辩护的,
cr_status cr_status_abbr cr_status
-- -------------------------
Good G Good
Bad B Bad
Unknown (or Unkn) U Unknown
并且两者都比使用整数作为主键实现域约束的表更好(IMO)。 (因为每个这样的表都需要额外的连接才能获得人们可以使用的信息。)