【问题标题】:table design for similar products同类产品的表设计
【发布时间】:2016-08-04 10:44:13
【问题描述】:

假设我有 N 家公司 (N

A公司描述了他们水果的以下特性:typefield1field2

B 公司 - typefield1field3

对于 A 公司和字段 type,有 3 个可能的值:1、2 和 3。对于 B 公司,它们是 1、2 和 4。对于字段 type,我最多有 10 个可能的值,总共大约 20 个可能的字段和大量的苹果属性条目。我的桌子应该是什么样子?

版本 1: 为 type 字段创建一个枚举,合并所有可能的值 (1,2,3,4)。使用所有可能的字段(typefield1field2field3)创建表 apples

版本 2: 为每个公司的type 字段创建单独的枚举。为每个公司的苹果属性创建单独的表。

版本 3: 与第 2 版相同,但将通用属性移至下一个表。

版本 4: Vesion 1 + table type_config 说明每个公司允许使用哪些 type 值。它将具有company_id 字段(fk 到某个表),以及具有可能值/或 fk 到该值的字段。

所有这些对我来说似乎都很糟糕。现实生活中最好的解决方案是什么?

【问题讨论】:

    标签: sql database postgresql database-design


    【解决方案1】:

    不要为此使用枚举。使用适当的参考表:

    create table Properties (
        PropertyId serial primary key,
        Name varchar(255)
    );
    

    然后,为每个公司创建一个属性表:

    create table CompanyProperties (
         CompanyPropertyId serial primary key,
         CompanyId int references Companies(CompanyId),
         PropertyId int references Properties(Property),
         value ???
    );
    

    【讨论】:

      【解决方案2】:

      尝试放置实体关系:

      1. 世界上有n种苹果
      2. 每种类型都可以有相似/不同的属性
      3. 一家公司可以处理 1..n 种不同的苹果
      4. 可以有 1..m 家公司。
      5. 不同公司的苹果交易

      您需要实体;

      1. 公司(上述第 4 项)
      2. 世界上不同类型的苹果类型(第一项)
      3. 具有哪些属性的苹果类型(对于上述第二项)

        (a) 最好将区分作为跨类型的强制属性 -- 你可以使这些非空列 (b) 跨类型的非强制属性 - 使它们可以为空列

      4. 公司卖什么苹果(上述第 3 项)
      5. 可以保存所有类型的苹果事务的事务表
        • 公司、Apple Type 和其他交易项目。

      【讨论】:

        猜你喜欢
        • 2012-09-16
        • 2017-02-05
        • 1970-01-01
        • 2014-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多