2009-07-14 3 views
1

Предположим, у меня есть две таблицы в отношениях родитель-ребенок. Назовем их «сайтами» и «зданиями», где «сайт» является родителем одного или нескольких «зданий». Я хочу, чтобы идентификаторы были уникальными для разных баз данных, поэтому я буду использовать идентификаторы GUID для идентификаторов.Должен ли я использовать общие имена или строго типизированные имена для первичных ключей и внешних ключей в базе данных?

Должен ли я использовать общие имена для полей идентификатора в таблицах или строго типизированные имена и почему?

Пример 1 (родовые имена):

CREATE TABLE sites (
    id VARCHAR(38) NOT NULL, 
    -- other attributes 
); 

CREATE TABLE buildings (
    id VARCHAR(38) NOT NULL, 
    parent_id VARCHAR(38) NOT NULL, 
    -- other attributes 
); 

Пример 2 (строго типизированных Имена):

CREATE TABLE sites (
    site_guid VARCHAR(38) NOT NULL, 
    -- other attributes 
); 

CREATE TABLE buildings (
    building_guid VARCHAR(38) NOT NULL, 
    site_guid VARCHAR(38) NOT NULL, 
    -- other attributes 
); 

ответ

3

Я предпочитаю использовать building_id, site_id, чтобы имя столбца определяло его содержимое более явно, чем просто «id».Это также дает возможность использовать ANSI присоединиться «с помощью» Синтаксис:

select site.site_id, building.building_id 
from building 
join site using (site_id); 

Еще одно преимущество заключается в том, что, когда такие столбцы используются в запросах (или представлений или подзапросов), они не нуждаются в повторной-Aliasing так часто - как это:

select site.id as site_id, building.id as building_id 
from building 
join site on site.id = building.site_id; 
+0

Интересно. Я не знал об этом синтаксисе ANSI. Благодарю. –

+0

@Tony: Я пытаюсь выяснить, что в настоящее время поддерживает этот синтаксис. У вас есть какие-либо ссылки, которые вы могли бы направить мне, чтобы определить это и, возможно, дать ему имя, которое я могу найти? –

+1

См. Http://en.wikipedia.org/wiki/Join_(SQL), в котором говорится: «Предложение USING поддерживается MySQL, Oracle, PostgreSQL и SQLite». –

1

Одна конвенции префикс всех поле в таблице зданий с " building_ ", поэтому у вас есть« building_id »,« building_name »и т. д. Внешние ключи, такие как« site_id », будут сохранять свое первоначальное имя, делая совершенно очевидным, что происходит.

редактировать

Я должен упомянуть, что я выбрал «_id» над «_uid» или «_guid», потому что есть только один ID поля, так что я не вижу никаких причин, чтобы подчеркнуть его тип данных.

+0

синтаксис пример ANSI Тони Эндрюс предлагает другую убедительную причину, чтобы использовать это соглашение: он не только поддерживается запросами генерирующих инструментов, но и как простой способ определить себя присоединиться. –

4

Я предпочитаю простой идентификатор, так как это стандартные соглашения, здесь отличная ссылка для всех соглашений об именах базы данных: http://weblogs.asp.net/jamauss/pages/DatabaseNamingConventions.aspx#Columns

«Правило 2а (Идентичность Поля основного ключа) - Для полей, первичный ключ для таблицы и однозначно идентифицировать каждую запись в таблице, имя должно просто быть «Идентификатором», поскольку это то, что это такое - поле идентификации. Это имя также более близко сопоставляется с именем свойства, например «Id» в ваших библиотеках классов. Другим преимуществом этого имени является то, что для объединений вы увидите что-то вроде «Клиенты ПРИСОЕДИНЯЮТСЯ ЗАКАЗЫ НА Customer.Id = Orders.CustomerId» , что позволяет избежать слова «клиент» ag ain после таблицы Customer. "

+1

+1: точно так же, как я предпочитаю –

+0

Сравните это с «Заказчики JOIN Order Заказы на Customer.CustomerId = Orders.CustomerId». Исходный идентификатор и его использование внешнего ключа идентичны, устраняя любую двусмысленность и позволяя многим инструментам проектирования запросов автоматически определять поля объединения. –

+1

О, и я буду осторожен со смешанным случаем в SQL, поскольку он не чувствителен к регистру. Безопаснее использовать все нижние с подставками, хотя это выглядит хуже. –

1

Это в основном вопрос вкуса. Должна быть некоторая согласованность над проектом. Наиболее важными из них являются:

  • , что вы можете запомнить имена повторяющихся столбцов, которые вы не должны смотреть в определения таблиц ввести простой SQL-запросы
  • , что вы не должны смотреть в код или документация, грубо понять смысл колонки

Лично я предпочитаю идентификаторы с тем же именем на всем протяжении проекта. Также проще написать общий код, который не зависит от конкретной таблицы.

Для внешних ключей я обычно использую шаблон <ForeignTable>_FK. Если в одной таблице имеется более одного внешнего ключа, я использую имя роли, как обычно, в объектно-ориентированном дизайне, <Role>_FK, например CurrentUser_FK.

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

  • Нет связанных вопросов^_^