【发布时间】:2018-06-06 23:05:51
【问题描述】:
我正在为买家和卖家创建一个在线市场。卖家的问题之一是“你们接受产品退货吗?”如果是这样,第二个问题是“谁支付退货的费用:买家还是卖家?”p>
我通常会选择标准化设计。因此,我通常会使用 items 表和 return_payers 表来设计这样的数据库并使用连接:
items
id | title | description | price | returns_accepted |
------------------------------------------------------------
1 | blah | blah blah | 80.00 | 0 // No
2 | blah | blah blah | 120.00 | 1 // Yes
3 | blah | blah blah | 40.00 | 1
4 | blah | blah blah | 60.00 | 0
return_payers
id | item_id | payer
--------------------------------
1 | 2 | 1 //Buyer
2 | 3 | 2 //Seller
但是因为这只是一个额外的信息,我想我可以像这样在产品上附加一个额外的列,从而减少连接的需要并可能加快阅读时间:
products
id | title | description | price | returns_accepted | returns_payer
----------------------------------------------------------------------------
1 | blah | blah blah | 80.00 | 0 | NULL
2 | blah | blah blah | 120.00 | 1 | 1
3 | blah | blah blah | 40.00 | 1 | 2
4 | blah | blah blah | 60.00 | 0 | NULL
我想知道的原因是因为我不仅有一个这样的例子,而且产品有很多这样的小问题,比如它有保修吗?是/否,如果是多长时间等。如果我说了 20 个这些小问题,规范化设计将需要 20 个具有 20 个连接的表,非规范化设计将有一个表,没有连接,但有很多 NULL 值。
因为它是一个在线市场,表格的阅读量将远远超过更新量。
欢迎咨询。谢谢。
【问题讨论】:
-
这些场景都没有以任何有意义的方式比其他场景或多或少地标准化。从技术上讲,我想您可以说 5NF 和 6NF 之间存在区别,但这几乎不值得麻烦。谁为退货买单是商品的一个属性,并且作为商品表中的一个属性似乎完全有效。空值没有什么问题。
-
为什么不是 0、1 或 2(不接受,买方,卖方)
-
@Michael-sqlbot 第二个设计显然是第一个在某种合理的惯用 SQL 意义上的非规范化(涉及左连接而不是内连接)。虽然由于每次退货可能有一个付款人,但它是 不必要 规范化的非规范化。这可能就是您所指的。
-
嗨。您的问题的答案涉及解释 1. 关系规范化 2. SQL 类似物 3. SQL 非规范化和 4. SQL 优化。了解他们。这个问题太广泛了,没有研究过。这也是一个常见问题解答。此外,除非您为您的情况提供成本和收益,否则其他人不可能在您的阅读速度与占用空间之间进行权衡。
-
@philipxy 是的,当我说“以一种有意义的方式”时,我就是这么想的。这不是必要的进一步规范化,因为没有明显的好处......并且非规范化形式似乎没有引入任何异常风险。从技术上讲,您当然是正确的。
标签: mysql database database-normalization denormalization