扩展关系数据库信息的最佳方法

时间:2017-02-15 20:09:29

标签: database relational-database entity-attribute-value

让我们说我们必须将不同类型产品的信息存储在数据库中。但是,这些产品有不同的规格。例如:

  • 电话:cpu,ram,storage ...
  • 电视:尺寸,分辨率......

我们希望将每个规范存储在表的一列中,并且所有产品(无论何种类型)都必须具有不同的ID。

为了符合这一点,现在我有一个名为Products的通用表(带有自动增量ID)和每种类型产品的一个从属表(ProductsPhonesProductsTV .. 。)具有规范并与具有外键的委托人联系。

我觉得这个解决方案效率很低,因为表Products只有一列(自动递增的ID)。

我想知道是否有更好的方法可以使用关系数据库来解决这个问题。

3 个答案:

答案 0 :(得分:1)

简短的回答是否定的。关系模型是一阶逻辑模型,意味着谓词可以在实体之间变化,但不能在其他谓词之间变化。这意味着不支持依赖类型和EAV模型。

EAV模型在SQL数据库中是可行的,但它们不具备关系性,因为EAV行中值域的域取决于属性字段的值(有时取决于实体字段的值)以及)。实际上,EAV模型的查询和维护效率往往较低。

PostgreSQL支持共享序列,允许您在没有公共超类型表的情况下确保唯一的自动递增ID。但是,超类型表可能仍然是FK约束的好主意。

您可能会在以后的Products表格中找到一些用途来保存TypeSerial numberCostWarranty duration,{{1}等常见属性},Number in stockWarehouse等...

答案 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