3

您好我正在开发一个电子商务应用程序,我似乎在为产品目录设计我的数据库时遇到了一些问题。

我还阅读了有关 stackoverflow 的其他类似问题,但我认为它们没有提供我需要的答案。

这是要求:

产品目录应该由类别构成,每个类别都有未知数量的子类别,每个子类别都有未知数量的产品。

应用程序应具有随意添加类别、子类别和产品的能力。

子类别将决定每种产品类型的属性。

考虑到我刚才提到的内容,我将提供一个示例以及我考虑的 3 个选项以及为什么我认为它们不好。

让我们考虑一台计算机和一台洗衣机:计算机属性 - VideoCard,ProcesorType,内存洗衣机 -Putere(w),Maximum Preasure,滤水器

这两种产品将属于不同的类别和子类别:电脑 - PC 类别 洗衣机 - 电子产品类别。

候选人一: 在此处输入图像描述 在这种情况下,除了常见的名称和价格等所有产品属性都将存储在 ProductType 中。但这会导致大量 NULL 值和维护噩梦。而且我认为我不能创建其他产品类型,因为那将导致需要更改 ProductType 表以添加其他列。关于我访问数据的方式也存在一些问题,但我认为它们与这个问题无关。

候选人二:

在此处输入图像描述

在这种情况下,每种产品类型都将有一个单独的表,其中包含其属性。但是我将访问每个产品的数据,我将不得不创建对数据库的单独调用,从而导致重复很多步骤。此外,我看不到任何方法可以使应用程序能够添加额外的产品、类别和子类别类型,而无需开发人员这样做。

候选人三:

在此处输入图像描述

在这种情况下,我会将每个属性存储在 FormattedProperties 内的键值对中。我还将作为我的模型的类的名称存储在 className 列中。当我访问数据时,我会使用反射来检查特定的类并初始化我的对象。

我很确定这会起作用,但我不认为将所有属性存储在格式化的键值对字符串中是最好的方法,也可能不是一个好习惯。我也知道反射速度很慢,可能会有性能损失。

在设计数据库时我可以考虑其他更好的选择吗?一些示例或链接将不胜感激。

4

1 回答 1

5

您正在寻找子类型或产品,其中每个产品恰好是一个子类型

候选 1 称为“每个层次结构的表”或 TPH。一张表包含所有不同的子类型。这对于许多子类型来说会变得混乱:它只适用于少数

候选 2 被称为“每个类型的表”或 TPT。每个子类型有一个表。在 Product 表中,您有一列用于定义类型(已经存在,称为鉴别器),其中包含 ProductID 和鉴别器的超级键。同样,这会导致许多类型变得混乱。

候选人3被称为,呃,某物。这是拥有大量子类型的最简单方法。它似乎效率低下,但由于 TPT 和 TPH 设计的开销,它最适合使用许多不同的子类型进行扩展

就个人而言,我会为一些定义明确的子类型使用 TPT,但对许多子类型使用第三种设计。我不喜欢 TPH 冗余列,因为浪费了磁盘和内存(对于固定长度的列,即使为 NULL 也会分配空间)

于 2013-06-24T09:21:03.780 回答