MySQL规范化与非规范化

时间:2017-12-26 00:29:58

标签: mysql database database-normalization denormalization

我为买家和卖家创建了一个在线市场。对卖家来说,其中一个问题是"你接受产品退货吗?"如果是这样,第二个问题是"谁支付退货项目:买方或卖方?"

我总是经常选择标准化的设计。所以我通常会使用表和 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值。

因为它是一个在线市场,所以这些表的阅读量远远超过它们的更新。

建议欢迎。感谢。

1 个答案:

答案 0 :(得分:0)

这是一个哲学问题,因为在我的经验中会有很多2c的意见和#34;那里的想法。所以,在那个世界里,有一个:

只要清楚地定义了数据流程,

对表进行非规范化是完全正常的。您的数据库需要考虑两个想法:首先,它需要快速支持您的应用程序;第二,随着数据持有量和应用程序的增长,它必须尽可能地面向未来,以防止出现瓶颈。

您的想法是构建规范化数据模型,以便可以针对它执行商业智能,然后进行自动ETL(数据传输),您可以将数据非规范化为单独的聚合表,超索引,支持您的运营。因为您是这样做的,所以现在您可以利用您的数据进行未来的销售,而且您还可以使用特定的表来支持您的运营。

值得注意的是,无论哪种方式,如果您计划对数据执行任何类型的分析,将规范化数据库(数据仓库)放在不同的服务器上,那么非规范化(操作数据库)将防止Web服务器上的速度减慢当你在进行分析时。

希望这有帮助。