Наименование столбцов идентификаторов в таблицах базы данных - PullRequest
86 голосов
/ 16 октября 2008

Мне было интересно узнать мнение людей о присвоении имен столбцам ID в таблицах базы данных.

Если бы у меня была таблица с именем «Счета-фактуры» с первичным ключом столбца идентификаторов, я бы назвал этот столбец «InvoiceID», чтобы не конфликтовать с другими таблицами, и очевидно, что это.

Там, где я работаю, они называют все идентификаторы столбцов ID.

Таким образом, они будут делать следующее:

Select  
    i.ID 
,   il.ID 
From
    Invoices i
    Left Join InvoiceLines il
        on i.ID = il.InvoiceID

Теперь я вижу здесь несколько проблем:
1. Вам нужно будет создать псевдоним столбцов на
. 2. ID = InvoiceID не вписывается в мой мозг
3. Если вы не указали псевдоним таблиц и сослались на InvoiceID, очевидно ли, в какой таблице он находится?

Что думают другие люди на эту тему?

Ответы [ 24 ]

0 голосов
/ 17 октября 2008

См. соглашения об именах сайта Interakt для хорошо продуманной системы именования таблиц и столбцов. Метод использует суффикс для каждой таблицы (_prd для таблицы продуктов или _ctg для таблицы категорий) и добавляет его к каждому столбцу в данной таблице. Таким образом, столбец идентификаторов для таблицы продуктов будет id_prd и поэтому уникален в базе данных.

Они делают еще один шаг, чтобы помочь в понимании внешних ключей: внешний ключ в таблице продукта, который ссылается на таблицу категорий, будет idctg_prd, так что очевидно, к какой таблице он принадлежит (суффикс _prd) и к какой таблице это относится (категория).

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

0 голосов
/ 17 октября 2008

Для каждой таблицы я выбираю сокращенную букву дерева (например, Employees => Emp)

Таким образом, первичный ключ числового автонумерации становится nkEmp .

Он короткий, уникальный во всей базе данных, и я точно знаю его свойства.

Я сохраняю одинаковые имена в SQL и на всех используемых мной языках (в основном C #, Javascript, VB6).

0 голосов
/ 17 октября 2008

Я предпочитаю DomainName || 'Я БЫ'. (т.е. имя_домена + идентификатор)

DomainName часто, но не всегда, совпадает с TableName.

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

DomainName & ID может использоваться для именования внешних ключей, а также первичных ключей. Когда иностранные ключи названы в честь столбца, на который они ссылаются, это может оказать мнемоническую помощь. Формально привязывать имя внешнего ключа к ключу, на который он ссылается, нет необходимости, поскольку ограничение ссылочной целостности установит ссылку. Но это очень удобно, когда дело доходит до чтения запросов и обновлений.

Иногда имя_домена || «ID» нельзя использовать, потому что в одной и той же таблице будет два столбца с одинаковым именем. Пример: Employees.EmployeeID и Employees.SupervisorID. В этих случаях я использую RoleName || 'ID', как в примере.

И последнее, но не менее важное: я использую натуральные ключи, а не синтетические, когда это возможно. Есть ситуации, когда естественные ключи недоступны или ненадежны, но есть множество ситуаций, когда естественный ключ является правильным выбором. В этих случаях я позволяю естественному ключу взять имя, которое оно, естественно, будет иметь. В этом имени часто даже нет букв «ID». Пример: OrderNo, где No - это сокращение от «Number».

0 голосов
/ 16 октября 2008

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

SELECT * from Invoice inv, InvoiceLine inv_l where 
inv_l.InvoiceID = inv.ID 
SELECT * from Invoice inv, InvoiceLine inv_l where 
inv_l.ID = inv.InvoiceLineID 
SELECT * from Invoice inv, InvoiceLine inv_l where 
inv_l.ID = inv.InvoiceID 
SELECT * from Invoice inv, InvoiceLine inv_l where 
inv_l.InvoiceLineID = inv.ID 

Что хуже всего, это микс, который вы упоминаете, совершенно запутанный. Мне приходилось работать с базой данных, где почти всегда это был foo_id, за исключением одного из наиболее часто используемых идентификаторов. Это был полный ад.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...