Database design 具有动态信息的数据库表

Database design 具有动态信息的数据库表,database-design,Database Design,我在谷歌上搜索了一下,发现用动态列创建数据库几乎是不可能的。我先解释一下我的问题: 我正在为一位顾客做一个网店。它有多种计算机产品可供销售。CPU的HDD的RAM等。所有这些产品都有不同的属性,CPU有FSB,RAM有CAS延迟。但这非常不方便,因为我的订单表需要不同表的外键,这是不可能的 另一种选择是将所有特定于产品的信息存储在一个varchar或blob字段中,并让PHP计算出来。这个解决方案的问题是网站需要一个PC建设者。一个逐步的指导,以建立您的电脑。例如,如果客户决定他想要一个新的“i

我在谷歌上搜索了一下,发现用动态列创建数据库几乎是不可能的。我先解释一下我的问题:

我正在为一位顾客做一个网店。它有多种计算机产品可供销售。CPU的HDD的RAM等。所有这些产品都有不同的属性,CPU有FSB,RAM有CAS延迟。但这非常不方便,因为我的
订单
表需要不同表的外键,这是不可能的

另一种选择是将所有特定于产品的信息存储在一个varchar或blob字段中,并让PHP计算出来。这个解决方案的问题是网站需要一个PC建设者。一个逐步的指导,以建立您的电脑。例如,如果客户决定他想要一个新的“i7 920”或任何我想能够选择所有主板插座1366,这是不可能的,因为所有的数据都存储在一个字段。我知道可以从DB中选择所有主板,让PHP确定哪些主板适用于socket 1366,但我想知道


有更好的解决方案吗?

看看制作如下表格:

Products
ProductID      int     PK auto number/identity
ProductName    string
ProductType    char(1) FK to ProductTypes.ProductType
ProductCost
ProductPrice
...

HDDs
ProductID    int FK to Products.ProductID
HDDCapacity
HDDSpeed
....

RAMs
ProductID    int FK to Products.ProductID
RAMCapacity
RAMCASlatency
...

ProductTypes
ProductType             char(1)  PK  "H"=HDD, "R"=RAM, etc.
ProductTypeDescription  string

您有一个包含所有公共列的主表,以及基于ProductType列的特定列的一对一表。您的订单表现在可以FK到所有产品的Products.ProductID。

您需要的是子类化。一个表格将包含与所有产品相关的基本信息。这是您从订单表中引用的内容。然后,您可以让其他表引用您的products表,并包含基于产品类型的特定信息。比如:

Orders | Products / | \ CPUs RAM Motherboards
ProductId
ProductCategoryId
Name
etc...
命令 | 产品 / | \ CPU RAM主板
<对于动态数据库,您可以考虑


搜索EAV也会产生大量的Q/As,这些Q/As可以很好地解决您的特定难题。

您可能想看看这一点,以确定这是否是您真正想要的方式。。。我不太确定

真正的问题是,您有高度相关和非常不同的组件。然而,他们有共同的财产

假设您有一个ProductProperties表

ProductId 
PropertyTypeId
PropertyId
Value
products表应该类似于:

Orders | Products / | \ CPUs RAM Motherboards
ProductId
ProductCategoryId
Name
etc...
假设产品1是一个带有1366引脚输出的处理器,产品2是一个带有1366插座的主板,那么每个产品都有一个值为1366的“socket”类型的属性。这将使查询非常容易。通过查询ProductProperties表(连接到Products),只需排除他们当前正在查看的项目的ProductCategory,即可在其他类别中查找有效的产品。。。或者,如果你提前知道这个类别(比如主板),你可以选择这个方式

在管理方面,您可以定义产品模板,在添加新产品时自动引入PropertyTypes。他们只需选择模板,填写值并保存


顺便说一句,我很高兴知道有人在这样的手推车上工作。我喜欢,但我觉得他们一直忽略的一件事是能够链接诸如哪些处理器将与哪些主板一起工作之类的内容。

我唯一建议的另一件事是创建产品类型层次结构(例如ProductType=MB-INTEL-1366,ProductFamily=MB)。有一个非常特定的类型是必要的,因为您需要在构建过程中建议兼容的部分(例如,如果MB只支持IDE,那么您应该只建议IDE HDD)。像HD/RAM/VIDEO这样的通用“系列”组很适合报告和分析,但在构建兼容部件的系统时还不够。@Zachary,你说得很好,但我的回答只是想给出解决问题的一般方法,而不是给出确切的最终方案。