#sql-server #sql-server-2005 #sql-server-2008 #database-design #normalization
#sql-сервер #sql-server-2005 #sql-server-2008 #база данных-проектирование #нормализация
Вопрос:
У меня есть 2 таблицы (FirstTable amp; SecondTable). Моя первая таблица — это таблица заголовков, а вторая таблица — таблица подробностей, но первая таблица имеет сложный первичный ключ. Как я могу иметь ссылку в моей SecondTable на первую таблицу, которая была бы НОРМАЛЬНОЙ и лучшим выбором.
Ответ №1:
В вашем случае есть по крайней мере три способа сделать это. Выбранный вами способ зависит от информации, которую вы нам еще не сообщили.
Хорошенько подумайте, прежде чем выбирать. Тот факт, что вы задаете такой простой вопрос, предполагает, что вы, вероятно, допускаете ошибки при реализации. (Это наблюдение, а не критика.) Сначала поработайте над исходной копией вашей базы данных. Ожидайте ее уничтожения.
- Сохраните весь первичный ключ FirstTable во SecondTable. Это означает добавление столбца для Key_F2 во SecondTable, заполнение его правильными данными, удаление старого ограничения и добавление нового, которое будет включать предложение типа
foreign key (Key_F1, Key_F2)
.
references FirstTable (Key_F1,
Key_F2) - Объявите УНИКАЛЬНОЕ ограничение для FirstTable.Key_F1. Затем вы можете добавить новое ограничение во SecondTable, которое будет включать предложение типа
foreign key (Key_F1) references
. Конечно, это будет работать, только если значения в FirstTable.Key_F1 уникальны.
FirstTable (Key_F1) - Добавьте столбец во SecondTable, чтобы сохранить значение в FirstTable.ИДЕНТИФИКАТОР и заполните этот столбец правильными данными. Затем вы можете удалить столбец SecondTable.Key_F2 и задайте ссылку на внешний ключ из SecondTable.Идентификатор для FirstTable.ID .
Комментарии:
1. большое вам спасибо. Я думаю о № 3 и хочу спросить, использую ли я идентификатор, который является идентификатором, когда я хочу объединить первую и вторую таблицы в соответствии с идентификатором, использует ли оптимизатор индекс, если когда-либо? каков наилучший способ в соответствии с нормализацией и оптимизацией?
2. Вы можете использовать IDENTITY в FirstTable. (Не во SecondTable.) Оптимизатор будет использовать любые индексы, которые, по его мнению, будут полезны. Вероятно, у вас должен быть индекс для каждого столбца, используемого в соединении или в предложении WHERE. Иногда создание одного индекса для пары столбцов лучше, чем по одному индексу для каждого из двух столбцов.