У меня есть таблица, содержащая объекты, что-то вроде этого:
PK ObjectId
FK ObjectTypeId
Description
etc
Объекты должны быть сгруппированы. Мне дали ряд предложений, все из которых «работают», и некоторые мне нравятся больше, чем другие. Ни один из них не идеален, поэтому я изо всех сил пытаюсь остановиться на какой-то конкретной модели.
1/ Добавьте внешний ключ, ссылающийся на себя. Это чисто, но не идеально, потому что (а) нет логического родителя (это группа, а не иерархия) и (б) для LINQ-to-SQL потенциально сложно пройти через самореферентную иерархию - потребуется проверить, является ли текущий объект «родительским» или «дочерним» объектом и т. д.
PK ObjectId
FK ParentObjectId
2/Добавить родительскую таблицу и внешний ключ. Это добавляет ограничения, но таблица Group не содержит никакой полезной информации — она существует только для предоставления ограничения и идентификатора GroupId.
Table Object
PK ObjectId
FK GroupId
Table Group
PK GroupId
3/ Добавьте GroupId без ограничения или внешнего ключа. Нет целостности данных. Теоретически, когда вставляется новая группа объектов, каждому объекту присваивается GroupId = первый назначенный ObjectId. Пожалуй, самое простое и практичное решение.
e.g.
ObjectId GroupId
...
15 10
16 16
17 16
...
21 16
22 22
Мой вопрос в том, какой из них является лучшим в теории и/или на практике и почему. Или, пожалуйста, подскажите мне лучший способ сделать это! Мне лично нравится (2), потому что он нормализован, но мне сказали, что таблица только с одним полем — плохой дизайн. Мысли и предложения?