带有动态信息的数据库表

时间:2010-06-16 17:17:36

标签: database-design

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

我正在为客户建立一个网上商店。它有多种计算机产品可供出售。 CPU的HDD的RAM等。所有这些产品具有不同的属性,CPU具有FSB,RAM具有CAS延迟。但这非常不方便,因为我的orders表需要外键到不同的表,这是不可能的。

另一个选择是将所有产品特定信息存储在varchar或blob字段中,让PHP弄明白。该解决方案的问题在于网站需要PC构建者。构建PC的分步指南。因此,例如,如果客户决定他想要新的“i7 920”或我希望能够为插座1366选择所有主板,那是不可能的,因为所有数据都存储在一个字段中。我知道可以从数据库中选择所有主板,让PHP找出哪些是socket 1366,但我想知道,

有更好的解决方案吗?

4 个答案:

答案 0 :(得分:2)

看看如下表:

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。

答案 1 :(得分:1)

对于动态数据库,您可以考虑EAV Database Model

搜索SO以获取EAV也会产生大量的问答,以便能够解决您的特定难题。

答案 2 :(得分:1)

你可能想看看这个question/answer,以便弄清楚你是否真的想要这样做......我不太确定。

真正的问题是你有高度相关和非常不同的组件。但是,他们确实共享属性......

所以,假设您有一个类似于

的ProductProperties表
ProductId 
PropertyTypeId
PropertyId
Value

产品表应该是这样的:

ProductId
ProductCategoryId
Name
etc...

假设产品1是1366引脚输出的处理器,而产品2是带有1366插槽的主板,那么每个产品都具有“Socket”类型的属性,其值为1366.这将使其非常容易查询。通过查询ProductProperties表(加入产品),只需排除他们当前正在查看的项目的ProductCategory,即可找到其他类别的产品......或者,如果您提前了解类别(如主板),则只需选择那样。

您可以通过定义在添加新产品时自动引入PropertyTypes的产品模板,在管理端更进一步。他们只需选择模板,填写值并保存..

作为旁注,我很高兴知道有人正在开这样的车。我喜欢newegg,但我觉得他们一直错过的一件事就是能够将哪些处理器与哪些主板配合使用。

答案 3 :(得分:0)

您正在寻找的是子类化。一个表格将包含与所有产品相关的基本信息。这是您从订单表中引用的内容。然后,您可以让其他表引用您的产品表,并根据产品类型包含特定信息。类似的东西:

               Orders
                  |
               Products
              /   |   \
           CPUs RAM Motherboards