Вы могли бы сделать 1. но поскольку ваши атрибуты не являются фиксированными, они являются просто парами имя-значение, это выглядит как многократное дублирование.
2 кажется плохой идеей, так как неудобно применятьцелостность с такого рода настройками.
для 3, могли бы вы иметь таблицу ссылок в середине для группы атрибутов, которая содержит идентификатор группы и идентификаторы отдельных GenericAttribute
с, затему вас есть 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
идентифицирует коллекцию GenericAttribute
экземпляров, которые связаны с Pet
илиPerson
.Это также означает, что если вам нужно приписать что-то еще в будущем, вам просто нужно добавить AttributeGroupId
к этой вещи.
РЕДАКТИРОВАТЬ:
Вы действительно должны подумать, почему вы делаетеэто хотя.Ваши атрибуты действительно динамичны, так как это единственная причина, по которой я могу подумать, что вы захотите эту модель?т.е. ваши пользователи определяют атрибуты в приложении, могут ли они добавить любой атрибут, который они хотят, для персонажа или питомца?Если нет, то если приложение контролирует атрибуты, вам следует принять во внимание совет Брока.Если пользователи сами вводят атрибуты и их значения, то вам может понадобиться такая модель, но она значительно усложнит ваши запросы.Если вы можете избежать этого, то, вероятно, это правильно.Я привел это в качестве примера решения вашего вопроса, я не могу предположить, что это хорошая идея, не зная больше о вашем конкретном случае использования.
EDIT2:
Как у вас естьу вас может быть фиксированный набор атрибутов, которые могут иметь как питомец, так и человек:
Attributes
- Id (PK)
- Attribute1
- Attribute2
...
- AttributeN
Person
- Id (PK)
- Name
- AttributesId (FK)
Pet
- Id (PK)
- Name
- AttributesId (FK)
, что позволяет избежать дублирования всех атрибутов, если их много, и позволяет выполнять довольно простые запросы, проверку целостности истрогая типизация данных.