繁体   English   中英

数据建模帮助-是否添加其他表,更改现有表的用法或其他?

[英]Data Modeling Help - Do I add another table, change existing table's usage, or something else?

假设我有以下表格和关系:

Person
- Id (PK)
- Name

一个人可以养0只或以上的宠物:

Pet
- Id (PK)
- PersonId (FK)
- Name

一个人可以具有0个或多个属性(例如年龄,身高,体重):

PersonAttribute
_ Id (PK)
- PersonId (FK)
- Name
- Value

问题:我也需要代表宠物的属性。 事实证明,这些宠物属性在大多数情况下与人的属性相同(例如,宠物也可以具有年龄,身高和体重)。 如何代表宠物属性?

  1. 是否创建PetAttribute表?

    PetAttribute

    • ID(PK)
    • PetId(FK)
    • 名称
  2. 是否将PersonAttribute更改为GenericAttribute并在其中包含2个外键-一个连接到Person,另一个连接到Pet?

    GenericAttribute

    • ID(PK)
    • PersonId(FK)
    • PetId(FK)
    • 名称

    注意:如果设置了PersonId,则未设置PetId。 如果设置了PetId,则不设置PersonId。

  3. 还有其他事吗

实际上,您应该删除PersonAttribute表,而只需将列(年龄,身高,体重等)添加到Person表中。

在“宠物”表中添加类似的列。 这样可以避免常见的初学者错误,即“实体属性值表”。 例如,请参见“ 应避免的五个简单数据库设计错误 ”。

只有在所有者可以拥有多个该确切属性的情况下,才应在单独的表中放置一个“属性”(例如权重)。 然后,该表应该是特定的“ WeightHistory”,如果它是随时间变化的权重列表等。

您可以做1.但由于您的属性不是固定的,因此它们只是名称/值对,这似乎有很多重复之处。

2似乎是个坏主意,因为用这种设置来强制执行完整性是很尴尬的。

对于3,您是否可以在中间找到一个属性组的链接表,其中包含该组的ID和各个GenericAttribute的ID,那么您可以将AttributeGroupId作为人和宠物的属性吗?

Table AttributeGroup
- Id (PK)
- GenericAttributeId  (PK,FK)

Table GenericAttribute
- Id (PK)
- Name
- Value

Person
- Id (PK)
- Name
- AttributeGroupId

Pet
- Id (PK)
- Name
- AttributeGroupId

因此AttributeGroupId标识与PetPerson关联的GenericAttribute实例的集合。 这也意味着,如果您将来需要分配其他属性,则只需将AttributeGroupId添加到该AttributeGroupId

编辑:

您确实需要考虑为什么要这样做。 您的属性真的是动态的吗,因为这是我想得到此模型的唯一原因? 也就是说,您的用户是否在应用程序中定义属性,他们可以将所需的任何属性添加到“人”或“宠物”吗? 否则,如果应用程序控制属性,则应考虑Brock的建议。 如果用户自己输入属性及其值,则可能需要这样的模型,但这会使查询变得更加复杂。 如果您可以避免它,那么这样做可能是正确的。 我以此为例来解决您的问题,如果不进一步了解您的特定用例,就不能建议这是一个好主意。

EDIT2:

由于您拥有宠物和人物都可以拥有的一组固定属性,因此您可以拥有:

Attributes
- Id (PK)
- Attribute1
- Attribute2
...
- AttributeN

Person
- Id (PK)
- Name
- AttributesId (FK)

Pet
- Id (PK)
- Name
- AttributesId (FK)

如果属性很多,可以避免所有属性的重复,并允许相当简单的查询,完整性检查和强大的数据类型。

我认为,在对PetAttribute和PersonAttribute进行更深入的建模时,您会发现它们是更通用的功能(称为PersonOrPetAttribute)的专业化。

如果要由我自己决定,我将把两个表分开,直到缺少PersonOrPetAttribute的表开始使查询更加困难。

如果您发现它与众不同,那么您可能应该在Google上搜索“广义专业化关系建模”。 这将为您找到几篇有关用表对gen-spec模式进行建模的主题的好文章。 这些文章将为您提供更多有关如何执行此操作的信息,而不是我将在此响应中提供的信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM