让我们说我们必须将不同类型产品的信息存储在数据库中。但是,这些产品有不同的规格。例如:
我们希望将每个规范存储在表的一列中,并且所有产品(无论何种类型)都必须具有不同的ID。
为了符合这一点,现在我有一个名为Products
的通用表(带有自动增量ID)和每种类型产品的一个从属表(ProductsPhones
,ProductsTV
.. 。)具有规范并与具有外键的委托人联系。
我觉得这个解决方案效率很低,因为表Products
只有一列(自动递增的ID)。
我想知道是否有更好的方法可以使用关系数据库来解决这个问题。
答案 0 :(得分:1)
简短的回答是否定的。关系模型是一阶逻辑模型,意味着谓词可以在实体之间变化,但不能在其他谓词之间变化。这意味着不支持依赖类型和EAV模型。
EAV模型在SQL数据库中是可行的,但它们不具备关系性,因为EAV行中值域的域取决于属性字段的值(有时取决于实体字段的值)以及)。实际上,EAV模型的查询和维护效率往往较低。
PostgreSQL支持共享序列,允许您在没有公共超类型表的情况下确保唯一的自动递增ID。但是,超类型表可能仍然是FK约束的好主意。
您可能会在以后的Products
表格中找到一些用途来保存Type
,Serial number
,Cost
,Warranty duration
,{{1}等常见属性},Number in stock
,Warehouse
等...
答案 1 :(得分:0)
虽然这不能完全通过关系方式完成,但您仍然可以将表格标准化一些,并使其更容易编码。
您可以拥有以下表格:
-- what are the products?
Products (Id, ProductTypeId, Name)
-- what kind of product is it?
ProductTypes (Id, Name)
-- what attributes can a product have?
Attributes (Id, Name, ValueType)
-- what are the attributes that come with a specific product type?
ProductTypeAttributes (Id, ProductTypeId, AttributeId)
-- what are the values of the attributes for each product?
ProductAttributes (ProductId, ProductTypeAttributeId, Value)
对于手机和电视:
ProductTypes (1, Phone) -- a phone type of product
ProductTypes (2, TV) -- a tv type of product
Attributes (1, ScreenSize, integer) -- how big is the screen
Attributes (2, Has4G, boolean) -- does it get 4g?
Attributes (3, HasCoaxInput, boolean) -- does it have an input for coaxial cable?
ProductTypeAttributes (1, 1, 1) -- a phone has a screen size
ProductTypeAttributes (2, 1, 2) -- a phone can have 4g
-- a phone does not have coaxial input
ProductTypeAttributes (3, 2, 1) -- a tv has a screen size
ProductTypeAttributes (4, 2, 3) -- a tv can have coaxial input
-- a tv does not have 4g (simple example)
Products (1, 1, CoolPhone) -- product 1 is a phone called coolphone
Products (2, 1, AwesomePhone) -- prod 2 is a phone called awesomephone
Products (3, 2, CoolTV) -- prod 3 is a tv called cooltv
Products (4, 2, AwesomeTV) -- prod 4 is a tv called awesometv
ProductAttributes (1, 1, 6) -- coolphone has a 6 inch screen
ProductAttributes (1, 2, True) -- coolphone has 4g
ProductAttributes (2, 1, 4) -- awesomephone has a 4 inch screen
ProductAttributes (2, 2, False) -- awesomephone has NO 4g
ProductAttributes (3, 3, 70) -- cooltv has a 70 inch screen
ProductAttributes (3, 4, True) -- cooltv has coax input
ProductAttributes (4, 3, 19) -- awesometv has a 19 inch screen
ProductAttributes (4, 4, False) -- awesometv has NO coax input
这不是完全关系的原因是你仍然需要先评估属性的值类型(bool,int等),然后才能在代码中以有意义的方式使用它。
答案 2 :(得分:0)
有产品表是好的。您可以在所有类型中放置所有常用列,例如产品名称,描述,成本,价格等。所以这不仅仅是自动增量ID。建议使用int或long int类型的内部标识作为主键。您还可以为产品管理系统添加另一个字段“代码”或任何您想要用户输入或用户友好的字段。如果在搜索或查询条件中使用,请确保将其编入索引。
HTH