admin

您如何在通用方案上对数据变量方差建模?的SQL

sql

最近我在考虑一些东西,我想知道做类似以下情况的正确方法是什么(我相信对于DB专家来说,做类似的事情是很普遍的事情)。

假设您有一个product表,如下所示(MySQL):

CREATE TABLE `products` (
  `id` int(11) NOT NULL auto_increment,
  `product_name` varchar(255) default NULL,
  `product_description` text,
  KEY `id` (`id`),
  KEY `product_name` (`product_name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

这里没有什么不寻常的。现在,假设在另一个表中有一个类别的层次结构,并且有一个单独的表将与产品表绑定多对多关系-因此每个产品都属于某种类别(我将省略那些类别)
,因为这不是这里的问题)。

现在来介绍有趣的部分-如果每个类别都要求对产品项附加变量集,该怎么办?例如,计算机监视器类别中的产品必须具有LCD /
CRT枚举字段,屏幕尺寸枚举等。-还有其他一些类别,可以说冰淇淋还具有其他一些变量,例如风味varchar,货架保存时间int等。

这里的问题在于,所有产品都有一组共同的变量(id,名称,描述和类似的变量),但是还有其他变量在类别之间并不一致-
但所有产品都应共享同一组,因为最后,它们都属于产品组,因此可以查询SELECT * FROM products ORDER BY
company_id(简单的示例,可能不具有代表性,但您可以看到图片)。

现在,我看到了许多潜在的解决方案:
-为每个产品类别生成单独的表,并在其中存储带有适当附加变量的产品-愚蠢且对查询不友好

-产品表与通用变量保持不变,并且为每个类别创建一个单独的表并包含其他变量变量用JOIN绑定两个表-标准化,但查询性能和清晰度问题-一个将如何过滤类别中的产品(第一个表-产品)以及如何为额外变量(例如17英寸LCD监视器)进行附加过滤-它需要SQL JOIN欺骗

-产品表保持不变,并添加另一个变量类型文本,该文本包含例如JSON数据,该文本包含其他变量-紧凑而整洁,但无法使用SQL筛选变量

我知道我在这里缺少非常明显和简单的东西-我对规范化技术有点生锈:)


编辑:
在问这个问题没有成功之前,我一直在搜索stackoverflow。但是,在发布问题后,我单击了我的一个标签“规范化”,并发现了几个类似的问题,这些问题导致查找“通用化专业化关系设计”。故事的要点是,这肯定是我的互联网生活中标签在搜索中真正有用的第一次。但是,我仍然想听听你们的意见。


edit2 :方法2的问题是我期望〜1000个专业化左右。有一个类别的层次结构(深度为1-4层),并且终端节点添加了专用变量-
它们以〜1000的顺序累积,因此添加要连接的专用表有点不切实际。


edit3 :由于在我的案例中,大量的属性易变性,建议的“实体属性值”看起来像是要走的路。查询噩梦来了!谢谢你们。


阅读 170

收藏
2021-06-07

共1个答案

admin

您希望有几种产品类型?它们每个都有自己的应用程序逻辑吗?

您可以创建一个称为“实体属性值”模型的通用模型,但是当您尝试处理产品的特定属性时,它会有很多陷阱。简单的搜索查询有时会变成真正的噩梦。基本思想是,您有一个表,其中包含产品ID,属性名称(或属性表中的ID)和值。您还可以添加表格来保存每种产品类型的模板。因此,一组表将告诉您任何给定产品的属性(可能带有有效值范围),而另一组表将告诉您任何产品的值是什么。

不过,我强烈建议您不要使用此模型,因为在您必须实际实施它之前,这似乎是一个很聪明的想法。

如果您对产品类型的数量有一定的限制,那么我将使用您的第二个解决方案-一个具有基本属性的主产品表,然后是每种特定类型产品的其他表。

2021-06-07