【问题标题】:database design - when to split tables?数据库设计 - 何时拆分表?
【发布时间】:2012-07-16 19:47:21
【问题描述】:

有时创建一个单独的表会产生更多的工作,我还是应该拆分它吗?

例如:在我的项目中,我有一张客户表,每个客户对每种产品都有自己的特价(只有 5 个产品和更多产品未来没有计划),每个客户也有一周中公司向他交付产品的独特日子。

当天数和产品价格是客户表中的列而不是单独的表时,许多操作(例如更改客户的天数/价格,或显示所有客户的天数和价格)会容易得多,因此是否只能创建在这种情况下有一张大客户表吗?有什么缺点?

更新:他们刚刚告诉我,大约一年后他们有机会添加更多产品,他们说他们的业务无论如何都不会超过 20-30 种产品。 我仍然不明白为什么在这种情况下,当产品的价格没有关系(每个客户都有自己的特价)时,在 Products 表中添加行比在 Customers 表中添加列更好? 我能想到的唯一好处是只有 5 个产品的客户不必“携带”20 个可空产品(节省服务器空间)?我没有太多经验,所以也许我错过了显而易见的事情?

【问题讨论】:

  • “未来不计划更多产品”。永远不要说永远...
  • “当天数和产品价格是客户表中的列而不是单独的表时,许多操作 [...] 会容易得多”。真的吗?写几条INNER JOIN 语句有多难?您想在/如果添加新产品时添加更多列?
  • 您需要区分对保持数据最新非常有用的规范化表格格式和对报告很重要的非规范化数据版本。听起来您需要一组单独的报告表,这些表可能每天更新,而不是即时更新。
  • @LittleBobbyTables - 我并不是说它是 hard 但它仍然需要更多的工作,尤其是应用程序有很多操作,所以我为什么不应该这样做那样又省了自己的工作?特别是新产品没有计划,如果他们想升级,他们会付给我更多的钱。那几天呢?一周 7 天相当稳定?
  • @GordonLinoff - 即使他需要单独的报告表,格式仍然可能会针对该模式的那部分进行“规范化”。 BornToCode - 如果您曾经进行过维护,这不是更多的工作。研究表明,大约 80% 的开发工作都花在了维护上,而不是用于初始生产。正确规范您的初始数据库,并且仅在性能要求时生成(n 个额外的)非规范化模式。对您的客户保持专业 - 不要采取“简单”的方式。此外,完全非规范化的结构可能难以轻松使用。

标签: sql database database-design


【解决方案1】:

显然,只是说应该始终规范化是不切实际的。没有任何建议总是正确的。

如果您可以肯定地说 5 个“项目”在很长一段时间内就足够了,我认为将它们存储为列是完全可以的,如果这样可以节省您的工作量。

如果您的预测失败并且需要存储第 6 个项目,您可以添加一个新列。只要列数不会以很高的概率失控,这应该不是问题。

请小心使用诸如许多程序员预测未来的能力非常有限这样的策略。

最后,只有一件事很重要:以最低的成本交付所需的解决方案。代码的纯度不是目标。

【讨论】:

  • 基本上所有“不同”的产品都是同一种产品,只是尺寸不同(如果你好奇的话,那就是鸡蛋……)所以我倾向于相信变化不会发生的假设经常发生。我也想听听您对“天数”的看法,我的直觉是创建一个特殊的天数表,但后来我发现为客户修改天数等更“笨拙”,所以我开始思考也许我应该将日期作为列添加到客户表中?
  • 当然。当项目数量恒定且很小(例如一周中的几天或鸡蛋大小)时,我通常自己使用列解决方案。简单快捷。
  • 如果我最终会在一个表中得到 30-40 列,它不会对性能产生不良影响吗?万一客户有一天会修改需求,这是唯一的缺点吗?为什么这里的每个人都在指责我,而在另一个 post 有人支持这种行为?
  • 存储一行的成本比存储一列的成本高 10 到 100 倍。对于您添加的每一列,您都会在您的案例中保存一行。如果您像许多 OLTP 服务器一样受 CPU 限制,那么这对于性能来说是一个很好的权衡。人们在责备你,因为程序员接受了识别模式和反模式的训练。通常,但在这种特殊情况下,这是一种反模式。不要太担心别人认为什么适合你。
  • @BornToCode,我倾向于拒绝。他们将添加更多产品,并添加产品变体(如颜色)。我认为此时您需要从基于列的策略中获得非常高的收益来证明它的合理性。需求变得不稳定,列数很高。
【解决方案2】:

规范化完全是关于数据完整性(一致性),仅此而已;与难、易、快、慢、高效和其他模糊属性无关。当前的设计几乎可以肯定允许数据异常。如果不是现在,当您尝试跟踪价格变化、发票、订单等时,它就是死路一条。

【讨论】:

  • 如果我有另一张特殊的桌子 - Sales History 在销售时保存所有这些信息怎么办?一切似乎都可以追踪?您能否举例说明您正在谈论的那些数据异常(我可以理解为什么规范化可能更适合修改(例如,如果会不断添加新产品),但在我的具体示例中,我无法理解什么样的预计会出现数据异常?)
  • @BornToCode;容易——看看你是否可以更新(更改)特定客户/产品的任何字段(行列交叉点)......这样你就可以获得不同的数据(应该是相同的)。
  • @BornToCode;无论如何,维基百科涵盖了它en.wikipedia.org/wiki/Database_normalization#Normal_forms 包括示例。
  • (which is supposed to be the same) - 很抱歉,我还是没听明白,在我的情况下,每个客户对每种产品都有他自己的特价吗?我试图查看维基百科,但不幸的是我的中文还不够好,无法理解他们在说什么:)
  • 假设有一种产品应该对所有客户都具有相同的价格(5 美元)。我可以只为一位客户更新为 3 美元(违反规则)吗?我想说每个产品都有一个基本价格,每个客户都有他自己的标记(折扣);价格属于产品,加价属于客户。请阅读该维基百科文章,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-30
  • 1970-01-01
  • 1970-01-01
  • 2019-01-10
  • 1970-01-01
  • 2018-02-17
  • 2011-02-24
相关资源
最近更新 更多