表设计为类似产品

时间:2016-08-04 10:44:14

标签: sql database postgresql database-design

假设我有N家公司(N <= 15)。每家公司都卖苹果。我想在数据库中保存apple属性。

A公司描述了其果实的以下属性:typefield1field2

公司B - typefield1field3

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

版本1: 为type字段创建枚举,合并所有可能的值(1,2,3,4)。创建包含所有可能字段的表typeapplestypefield1field2)。

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

版本3: 与版本2相同,但将公共属性移动到下一个表。

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

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

2 个答案:

答案 0 :(得分:0)

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

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 ???
);

答案 1 :(得分:0)

  

尝试放置实体关系:

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

您需要实体;

     
    
        
  1. 公司(上述第4项)
  2.     
  3. 世界上不同类型的苹果类型(第1项)
  4.     
  5. 具有什么属性的苹果类型(适用于上述第2项)          
          

    (a)最好将差异化作为不同类型的强制属性           - 您可以创建这些非空列       (b)跨类型的非强制性属性 - 使它们成为可为空的列

        
  6.     
  7. 公司销售什么苹果(上述第3项)
  8.     
  9. 可以容纳所有类型的苹果交易的交易表          
          
    • 公司,Apple Type&amp;其他交易项目。
    •     
  10.