Соглашение об именовании первичного ключа/внешнего ключа [закрыто]


в нашей группе разработчиков у нас есть бурные дебаты относительно Соглашения об именах для первичных и внешних ключей. В нашей группе есть в основном две школы мысли:

1:

Primary Table (Employee)   
Primary Key is called ID

Foreign table (Event)  
Foreign key is called EmployeeID

или

2:

Primary Table (Employee)  
Primary Key is called EmployeeID

Foreign table (Event)  
Foreign key is called EmployeeID

Я предпочитаю не дублировать имя таблицы в любом из столбцов (поэтому я предпочитаю вариант 1 выше). Концептуально это соответствует многим рекомендуемым практикам на других языках, где вы не используете имя объекта в его именах свойств. Я думаю, что именование внешнего ключа EmployeeID (или Employee_ID может быть лучше) говорит читателю, что он является ID колонка Employee таблица.

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

кроме того, я думаю, что это избыточно иметь имя таблицы в имени столбца, потому что если вы думаете о таблице как о сущности и столбце как о свойстве или атрибуте этой сущности, вы думаете о ней как об атрибуте ID Employee, а не EmployeeID атрибут сотрудника. Я не спрашиваю своего коллегу, что его PersonAge или PersonGender есть. Я спрашиваю его, сколько ему лет.

13 77

13 ответов:

Это действительно не имеет значения. Я никогда не сталкивался с системой, где есть реальная разница между выбором 1 и выбором 2.

у Джеффа Этвуда была отличная статья некоторое время назад на эту тему. В основном люди спорят и спорят наиболее яростно те темы,которые они не могут быть доказаны неправильно. Или с другой стороны, те темы, которые могут быть выиграны только через выносливость стиля флибустьера, основанную на последних мужских аргументах.

Выберите один и скажите им, чтобы сосредоточиться на проблемы, которые на самом деле влияют на ваш код.

EDIT: если вы хотите повеселиться, попросите их подробно указать, почему их метод превосходит рекурсивные ссылки на таблицы.

Если два столбца имеют одинаковое имя в обеих таблицах (соглашение №2), Вы можете использовать синтаксис USING в SQL для сохранения некоторого набора текста и некоторого шаблонного шума:

SELECT name, address, amount
  FROM employees JOIN payroll USING (employee_id)

еще один аргумент в пользу конвенции #2 заключается в том, что это путь реляционная модель была разработана.

значение каждого столбца частично передал обозначения имя соответствующего домена.

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

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

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

например, для самореферентной таблицы, когда существует более одного столбца FK, который самореферентно ссылается на одну и ту же таблицу PK, вы должны нарушить оба "стандарта", так как два столбца FK не могут быть названы одинаково... например, EmployeeTable с EmployeeId PK, SupervisorId FK, MentorId Fk, PartnerId FK,...

Я согласен, что есть немного, чтобы выбрать между ними. Для меня гораздо более важной вещью в любом стандарте является "стандартная" часть.

Если люди начинают делать свое дело-они должны быть нанизаны на их праотцам. ИМХО:)

Если вы смотрите на код приложения, а не только запросы к базе данных, некоторые вещи кажутся мне ясными:

  1. определения таблиц обычно напрямую сопоставляются с классом, который описывает один объект,поэтому они должны быть единственными. Чтобы описать коллекцию объекта, я обычно добавляю "Array" или "List" или "Collection" к сингулярному имени, поскольку это более четко, чем использование множественных чисел, указывает не только на то, что это коллекция, но и на то, какая это коллекция. С этой точки зрения, я вижу имя таблицы - это не имя коллекции, а имя типа объекта, для которого она является коллекцией. Администратор базы данных, который не пишет код приложения, может пропустить этот момент.

  2. данные, с которыми я имею дело, часто используют "ID" для целей идентификации без ключа. Чтобы устранить путаницу между ключом " ID "и неключевым"ID "s, для имени первичного ключа мы используем" ключ " (это то, что есть, не так ли?) с префиксом имени таблицы или аббревиатурой имени таблицы. Это приставка (и я резервирую это только для первичного ключа) делает имя ключа уникальным, что особенно важно, потому что мы используем имена переменных, которые совпадают с именами столбцов базы данных, и большинство классов имеют родителя, идентифицированного по имени родительского ключа. Это также необходимо, чтобы убедиться, что это не зарезервированное ключевое слово, которое является только "ключом". Чтобы облегчить согласованность имен ключевых переменных и обеспечить программы, выполняющие естественные соединения, внешние ключи имеют то же имя, что и используемые в таблицу, в которой они являются первичным ключом. Я уже не раз сталкивался с программами, которые работают намного лучше, используя естественные соединения. В этом последнем пункте я признаю проблему с самореферентными таблицами, которые я использовал. В этом случае я бы сделал исключение из правила именования внешнего ключа. Например, я бы использовал ManagerKey в качестве внешнего ключа в таблице Employee, чтобы указать на другую запись в этой таблице.

мне нравится конвенция №2-в исследовании этой темы и поиске этого вопроса перед публикацией моего собственного, я столкнулся с проблемой, где:

Я выбираю * из таблицы с большим количеством столбцов и присоединяю ее ко второй таблице, которая аналогично имеет большое количество столбцов. Обе таблицы имеют столбец " id " в качестве первичного ключа, и это означает, что я должен специально выбрать каждый столбец (насколько я знаю), чтобы сделать эти два значения уникальными в результате, т. е.:

SELECT table1.id AS parent_id, table2.id AS child_id

хотя использование соглашения #2 означает, что у меня все еще будут некоторые столбцы в результате с тем же именем, теперь я могу указать , который id мне нужен (родитель или ребенок) и, как предложил Стивен Хьювиг,USING заявление упрощает вещи дальше.

Я всегда использовал userId как ПК на одной таблице и userId на другой стол в качестве FK. 'я серьезно думаю об использовании userIdPK и userIdFK как имена, чтобы идентифицировать один от другого. Это поможет мне быстро идентифицировать PK и FK при просмотре таблиц, и кажется, что он очистит код при использовании PHP/SQL для доступа к данным, что упрощает понимание. Особенно когда кто-то смотрит на мой код.

соглашение, которое мы используем там, где я работаю, довольно близко к A, за исключением того, что мы называем таблицы во множественном числе (т. е. "сотрудники") и используем подчеркивания между таблицей и именем столбца. Преимущество этого заключается в том, что для ссылки на столбец это либо "employees _ id", либо "employees.id-в зависимости от того, как вы хотите получить к нему доступ. Если вам нужно указать, из какой таблицы идет столбец, " сотрудники.сотрудников _ ИД" определенно лишними.

Я использую соглашение №2. Теперь я работаю с устаревшей моделью данных, где я не знаю, что означает в данной таблице. Что плохого в том, чтобы быть многословным?

Как насчет именования внешнего ключа

role_id

где роль-это роль, которую ссылочный объект имеет относительно таблицы под рукой. Это решает проблему рекурсивной ссылки и нескольких fks к одной и той же таблице.

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

в любом случае иметь длинные аргументы-плохая идея

вы рассмотрели следующее?

Primary Table (Employee)   
Primary Key is PK_Employee

Foreign table (Event)  
Foreign key is called FK_Employee

"где в" сотрудник внутренний порядок соединения на заказ.employee_id = employee.id " есть ли необходимость в дополнительной квалификации?".

нет необходимости в дополнительной квалификации, потому что квалификация, о которой я говорил, уже есть.

"причина, по которой бизнес-пользователь ссылается на идентификатор заказа или идентификатор сотрудника, заключается в предоставлении контекста, но на уровне dabase у вас уже есть контекст, потому что вы ссылаетесь на таблицу".

молитесь, скажите мне, если колонка названный "ID", тогда как это" реферирование [sic] к таблице " выполняется точно, если только не квалифицируя эту ссылку на столбец ID точно так, как я говорил ?