Уникальный идентификатор, общий для нескольких таблиц sql 2008 - PullRequest
1 голос
/ 28 марта 2012

У меня проблема с моим сайтом.На сайте есть несколько сущностей: статьи, посты, обзоры ... orund 6 типов.Теперь я представляю пользователю возможность оценивать предмет (это может быть любой из этих объектов)

Я создал таблицу Votes (первичный ключ int Id, int ItemId, nvarchar (30) Ip, datetime Timestamp, int Vitalue).Здесь я буду хранить все голоса и их ips.

Моя проблема в том, что у меня должен быть уникальный ItemID ... но в моей базе данных уже есть элементы разных типов с одинаковым идентификатором.Все таблицы начали идентификаторы с 0. Какие варианты вы видите для моего дизайна, чтобы иметь возможность хранить все голоса в одной таблице?

Ответы [ 3 ]

3 голосов
/ 28 марта 2012

Ваш подход заключается в попытке присвоить несколько значений полю «ItemId», что приведет к проблемам, с которыми вы сталкиваетесь.Если бы я увидел «9500» в этом поле, как бы я узнал, что это значит?

Я бы предложил сбросить поле ItemId и создать таблицы «переходов» между Голосами и другими объектами.

Например, ваши лица:

+-----------+
| Articles  |
+-----------+
| ArticleId | PK
| ~ snip ~  |
+-----------+

+-----------+
| Posts     |
+-----------+
| PostId    | PK
| ~ snip ~  |
+-----------+

... и т. Д. *

Таблица ваших голосов:

+-----------+
| Votes     |
+-----------+
| VoteId    | PK
| ~ snip ~  |
+-----------+

Ваши таблицы "пешеходного перехода":

+--------------+
| ArticleVotes |
+--------------+
| ArticleId    | PK, FK to Articles
| VoteId       | PK, FK to Votes
+--------------+

+--------------+
| PostVotes    |
+--------------+
| PostId       | PK, FK to Posts
| VoteId       | PK, FK to Votes
+--------------+

Обратите внимание, что в таблицах пешеходного перехода вы должны создать составной первичный ключ, состоящий из обеих ссылок FK на соответствующие объекты, что обеспечит уникальность.

По моему опыту, этосоответствующий нормализованный подход к домену, который вы описываете.

В запросах, чтобы получить голоса за статьи (например), просто ВНУТРЕННЕЕ СОЕДИНЕНИЕ статей через ArticleVotes to Votes.Чтобы получить все голоса, просто запросите голоса.

Кроме того, я бы предложил создать таблицу IPAddresses и FKing к ней в таблице голосов, чтобы уменьшить избыточность.

1 голос
/ 28 марта 2012

Опция, которая не была упомянута, была GUID.Если вы используете GUID в ваших статьях / сообщениях / обзорах / и т.д.вместо первичных ключей int вы можете полагаться на их уникальность.Я не говорю, что вы должны использовать этот маршрут, так как он может добавить дополнительные издержки для хранения / поиска идентификаторов GUID, а не целых.

Я бы рекомендовал добавить поле типа в таблицу голосов и включить егоключ.Похоже, вы уже думали об этой идее, но беспокоитесь о производительности.Если вас беспокоит производительность, сделайте несколько тестов, чтобы убедиться, что запросы таблиц соответствуют вашим потребностям, прежде чем вносить изменения в производство.

0 голосов
/ 28 марта 2012

Одна возможность - преобразовать ваш набор разрозненных таблиц в набор типов / подтипов. Обсуждение этого можно найти здесь . Недостаток (возможно, существенный) заключается в том, что вам придется реорганизовать все ваши таблицы ... но тогда у вас будет один идентификатор (возможно, «ItemId?»), Используемый для уникальной идентификации всех типов ваших элементов.

...