0

我有这个当前设置:

产品

product_id | product_name | category_id

类别

category_id | category_name

小贩

vendor_id | vendor_name | vendor_status

供应商价格

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 种产品,每个产品都有几个不同的供应商,每个供应商的价格都不同,这使得它在 Sphinx 中算作超过 150 万份文档。

我的设计是错的,还是将其更改为更规范的设计会有什么好处?

更新

我还有一张桌子来存放所有产品类别。我已经更新了上面的架构,在最初的帖子中忘记了。

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

因为可以暂停供应商 (vendor.vendor_status),所以所有查询都必须通过几个返回到供应商表的连接来执行。

在插入中,我从特定供应商处删除产品中的所有内容,由于外键约束,来自同一供应商的所有供应商价格也会被删除。然后我在 product 和 vendor_price 中插入一个新的。

希望这是有道理的。

更新 2

今晚进行了大量查询测试后,我发现将 vendor_status 保存在 vendor 表中确实会减慢很多速度。

因为数据库每次选择价格时都必须在 vendor_price 和 vendor 之间加入选择,这对于获取例如:

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

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

查询耗时 7.8040 秒

查询耗时 3.1640 秒

当数据集变得如此庞大时,我想这是优化查询和使用大量缓存功能之间的平衡问题。即使在今天的硬件上,规范化也确实阻碍了速度。

4

1 回答 1

1

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

于 2012-07-18T22:20:20.707 回答