2014-11-22 4 views
1

У меня есть стол Person, каждый Person может посетить несколько стран. Страны, посещаемые каждой Person хранится в таблице CountryVisitЯвляется ли это хорошей практикой проектирования баз данных?

Person:

PersonId, 
Name 

РегионК:

CountryVisitId (primary key) 
PersonId (foreign key to 'Person.PersonId') 
CountryName 
VisitDate 

Для CountryVisit таблицы, мой первичный ключ CountryVisitId который является identity колонка. Эта конструкция приведет к тому, что Person может иметь только 1 CountryVisit, но CountryVisitId может быть 40, например. Лучше ли вы создать другой столбец с суррогатным ключом, чтобы действовать как столбец идентификации, а CountryVisitId - естественный ключ, который уникален для каждого PersonId?

+2

Почему бы не иметь 'person',' country' как независимые таблицы и таблицу сопоставлений 'CountryVisit'? Таким образом, вы гарантируете, что страны не имеют вариантов написания. – davek

+0

Да, это в моем оригинальном дизайне, я просто сделал более простой дизайн, чтобы уточнить мой вопрос. – user3340627

+1

Что вы хотите сохранить, если пользователь несколько раз посещает ту же страну? IE: это отношение 1-n или n-n? –

ответ

8

Это очень хорошо. Я бы предположил, что у вас есть отдельная таблица для стран с одной строкой для каждой страны. Тогда CountryVisits таблица будет иметь:

CountryVisitId PrimaryKey, 
PersonId ForeignKey, 
CountryId ForeignKey, 
VisitDate 

Это гарантирует, что название страны всегда пишется правильно и последовательно. Если вам нужен список стран для начала работы, ознакомьтесь с этой страницей Wikipedia. Также обратите внимание, что ваше определение страны может отличаться от стандартного списка стран (там фактически есть несколько), поэтому вы должны использовать свой собственный автоматически увеличиваемый первичный ключ, а не использовать код страны.

И вы должны снять требование и удалить уникальный или первичный ключ на PersonId, CountryId, если вы не хотите применять только одно посещение в каждой стране.

Смежные вопросы