了解数据库模式 - 规范化表单

时间:2012-07-18 21:53:14

标签: database-schema

我有这个当前设置:

产品

product_id | product_name | category_id

类别

category_id | category_name

供应商

vendor_id | vendor_name | vendor_status

vendor_price

vendor_id | product_id | vendor_price

根据我的理解,根据"规则"正常化应该有2 更多的表格声明了这样的关系:

rel_product_vendor_price

product_id | vendor_price_id

rel_vendor_price_vendor

vendor_price_id | vendor_id

然后上面名为vendor_price的表将删除product_id 添加了vendor_price_id。

我没有看到创建两个表以保持一致的重点 因为它会使查询复杂化。特别是INSERTS很复杂,必须在交易中执行。

目前,这些表格拥有超过300,000种产品,每种产品都有几种 不同的供应商,每个不同的价格,使其数量超过 斯芬克斯有150万份文件。

我的设计错了,或者将其更改为更标准化的设计是否有任何优势?

更新

我有一张桌子可以容纳所有产品类别。我已经更新了上面的架构,忘了在最初的帖子中。

通常我会根据类别拆分查询,并查询所有所属产品的每个类别。当用户点击产品时,我会查询该特定产品的所有价格,并按降序显示价格。

由于可以暂停供应商(vendor.vendor_status),因此必须使用多个连接执行所有查询,并返回到供应商表。

在插入中,我删除了特定供应商的产品中的所有内容,同一供应商的所有供应商价格也会因外键约束而被删除。然后我在产品和vendor_price中插入一个新的。

希望这是有道理的。

更新2

今晚进行了大量的查询测试,我发现将vendor_status保留在供应商表中真的会减慢很多东西。

因为数据库必须在每次选择价格时加入vendor_price和供应商之间的选择,这对于获取价格非常重要:

MIN(vendor_price)AS min_vendor_price,MAX(vendor_price)AS max_vendor_price)

在每个vendor_price行中保留vendor_status的副本意味着有很多冗余数据,但它确实加快了选择速度。

来自

查询耗时7.8040秒

查询耗时3.1640秒

当数据集变得如此之大时,我想这是在优化查询和使用大量缓存功能之间取得平衡的问题。即使在今天的硬件上,标准化也确实会受到阻碍。

1 个答案:

答案 0 :(得分:1)

规范化尝试消除冗余数据,因此插入/更新/删除不必一次处理多个表;相反,冗余数据可以通过消除大量连接的需要来加速查询,但是你必须在多个地方处理插入/更新/删除。您的3表架构对我来说很好,假设您只想根据供应商ID和产品ID查找价格,但请详细说明您希望运行的查询类型/您计划存储的其他类型的数据

相关问题