假设我有N家公司(N <= 15)。每家公司都卖苹果。我想在数据库中保存apple属性。
A公司描述了其果实的以下属性:type
,field1
,field2
,
公司B - type
,field1
,field3
。
对于公司A和字段type
,有3个可能的值:1,2和3.对于公司B,它们是1,2和4.对于字段{{1},我将有最多10个可能的值总共大约20个可能的字段和苹果属性的条目。我的桌子应该怎么样?
版本1:
为type
字段创建枚举,合并所有可能的值(1,2,3,4)。创建包含所有可能字段的表type
(apples
,type
,field1
,field2
)。
版本2:
为每个公司为field3
字段创建单独的枚举。为每个公司创建苹果属性的单独表。
版本3: 与版本2相同,但将公共属性移动到下一个表。
第4版:
Vesion 1 +表type
说明每个公司允许的type_config
值。它将具有type
字段(fk到某个表),以及具有可能值/或fk到该值的字段。
所有这些对我来说都很糟糕。什么是现实生活中最好的解决方案?
答案 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)
尝试放置实体关系:
- 世界上有n种苹果类型
- 每种类型都可以具有相似/不同的属性
- 一家公司可以处理1种不同的苹果类型
- 可以有1家公司。
- 不同公司的苹果交易
醇>您需要实体;
- 公司(上述第4项)
- 世界上不同类型的苹果类型(第1项)
- 具有什么属性的苹果类型(适用于上述第2项)
(a)最好将差异化作为不同类型的强制属性 - 您可以创建这些非空列 (b)跨类型的非强制性属性 - 使它们成为可为空的列
- 公司销售什么苹果(上述第3项)
- 可以容纳所有类型的苹果交易的交易表
醇>
- 公司,Apple Type&amp;其他交易项目。