Именование столбцов идентификаторов в таблицах базы данных

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

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

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

Итак, они сделали бы следующее:

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

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

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

Возможный дубликат Схема именования внешнего ключа

philipxy 08.07.2019 00:57
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
104
2
44 493
23
Перейти к ответу Данный вопрос помечен как решенный

Ответы 23

Мы используем InvoiceID, а не ID. Это делает запросы более удобочитаемыми - когда вы видите только ID, это может означать что угодно, особенно когда вы присваиваете таблице псевдоним i.

Согласитесь, и вы укажете основную причину, по которой не следует использовать «id», потому что у нас всегда есть псевдоним таблицы, такой как «i» для inoice, p для «product» в SQL или LINQ и т. д.

Cheung 13.10.2014 11:50

Использование Id более уместно. В таблице есть столбец «счета-фактуры», так что этого должно хватить. Если вы пишете кросс-табличные запросы, вам следует использовать более описательные псевдонимы. «i» недостаточно. Назовите это «счетами».

tmutton 09.03.2015 11:39

Неясно, что само по себе «ID» означает «Счета-фактуры». Предположим, у вас также есть внешние ключи для учетных записей и людей. Теперь, что такое «ID»? Разве в соединении не проще, скажем, прочитать a.InvoiceID = b.InvoiceID вместо a.ID = b.InvoiceID и не иметь возможности легко отладить его.

Jason Cohen 22.03.2015 01:32

@JasonCohen Это просто означает, что псевдоним таблицы является мусором, а не имя столбца.

Joshua Schlichting 13.09.2020 01:38

Я ненавижу простое имя id. Я настоятельно предпочитаю всегда использовать 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, за исключением одного из наиболее часто используемых идентификаторов. Это был настоящий ад.

Я слишком много раз читал слово «счет-фактура» в этом посте. Теперь это выглядит забавно

Kevin 16.10.2008 18:23

Тьфу, неявное присоединение! Я хочу вырвать себе глаза, глядя на это.

HLGEM 12.01.2012 20:21

Для простоты большинство людей называют столбец в таблице идентификатором. Если у него есть ссылка на внешний ключ в другой таблице, тогда они явно называют его InvoiceID (для использования вашего примера) в случае объединений, вы все равно используете псевдоним таблицы, поэтому явный inv.ID по-прежнему проще, чем inv.InvoiceID

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

Вы можете использовать следующее соглашение об именах. У него есть недостатки, но он решает ваши конкретные проблемы.

  1. Используйте короткие (3-4 символа) псевдонимы для имен таблиц, например, Invoice - inv, InvoiceLines - invl.
  2. Назовите столбцы в таблице, используя эти псевдонимы, например, inv_id, invl_id.
  3. Для справочных столбцов используйте invl_inv_id для имен.

таким образом вы могли бы сказать

SELECT * FROM Invoice LEFT JOIN InvoiceLines ON inv_id = invl_inv_id

ick! Я бы проголосовал против использования коротких псевдонимов для таблиц (или любого другого объекта). С псевдонимами вы никогда точно не узнаете, что такое короткое имя. Помните, есть много способов написать это неправильно; есть только один способ написать это правильно.

James Curran 16.10.2008 17:45

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

kemiller2002 16.10.2008 17:49

Я работал с базами данных, структурированными подобным образом, и, как только вы избавитесь от уродства, это довольно хорошая система.

kristian 16.10.2008 17:58

Возможно, псевдонимы. Подчеркивания? Просто сказать нет.

Amy B 16.10.2008 18:12

Используйте псевдонимы, чтобы добиться того же эффекта. выберите * из Invoice inv left присоединиться к InvoiceLines invl на inv.ID = invl.InvoiceID

yfeldblum 16.10.2008 18:57

Нет нет Нет Нет. псевдоним таблицы с аббревиатурой в запросе. Но имя таблицы должно быть полным.

Mesh 17.10.2008 18:43

Почему так много программистов ленивы и кажется, что ответ на все - печатать как можно меньше только потому, что слишком сложно набрать немного больше.

mP. 14.10.2009 09:55

Это не очень важно, вы, вероятно, столкнетесь с сималарными проблемами во всех соглашениях об именах.

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

В качестве имени столбца в базе данных я бы использовал «InvoiceID».

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

Если столбец НЕ будет использоваться во внешнем ключе, так что он используется только для однозначной идентификации строки для редактирования, редактирования или удаления, я назову его «PK».

Я всегда отдавал предпочтение ID вместо TableName + ID для столбца id, а затем TableName + ID для внешнего ключа. Таким образом, все таблицы будут иметь одно и то же имя для поля id и не будет повторяющегося описания. Мне это кажется проще, потому что все таблицы имеют одно и то же имя поля первичного ключа.

Что касается объединения таблиц и незнания, какое поле Id принадлежит какой таблице, на мой взгляд, запрос должен быть написан для обработки этой ситуации. Там, где я работаю, мы всегда отдаем предпочтение полям, используемым в операторе, с псевдонимом таблицы / таблицы.

Я понимаю старую ветку, но согласен. Также упрощает сопоставление на уровне доступа к данным: если все «объекты» имеют поле Id, которое должно быть уникальным, то при создании методов на уровне доступа к данным для выполнения таких действий, как удаление элементов, вы можете сделать их универсальными, поскольку вы можете получить список Идентификаторы для чего угодно и знайте, что вам просто нужно удалить where Id = blah из этой конкретной таблицы, вместо того, чтобы сохранять сопоставление того, что является уникальным для каждой таблицы, а также сопоставление имени таблицы / логического имени программы.

Mike 23.06.2013 07:50

Кевин, такой же, как ты. например: user_id, role_id для PKey и role_user_id для FKey. Это хорошо для масштабного проекта. Потому что, если все поля ID имеют имя «id», это слишком запутанно. Но я думаю, что это личное предпочтение, кто-то думает, что использовать только «id» понятно.

Cheung 13.10.2014 11:44

Это мое предпочтение. Тот факт, что запросы между таблицами труднее читать, не означает, что столбец Id должен быть изменен, чтобы упростить его. Просто сделайте свои псевдонимы более информативными.

tmutton 09.03.2015 11:44

Я подозреваю, что соглашение об использовании префикса ID с именем объекта исходит от людей, использующих "select * from" по каким-либо причинам. В среде, допускающей «выбор *», реальность обычно искажается в сторону поддержки массового выбора всего отовсюду. В этом нет особого смысла, если вы не выбираете все вслепую. Также есть ссылки на ИСПОЛЬЗОВАНИЕ и естественные объединения, которые довольно опасны и вообще не выглядят для меня аргументом, потому что они эффективно мешают вам использовать соглашение об именах внешних ключей на основе ролей.

Roman Polunin 16.02.2017 04:44

Если вы дадите каждому ключу уникальное имя, например "invoices.invoice_id" вместо "invoices.id", тогда вы можете без проблем использовать операторы "естественного соединения" и "использования". Например.

SELECT * FROM invoices NATURAL JOIN invoice_lines
SELECT * FROM invoices JOIN invoice_lines USING (invoice_id)

вместо

SELECT * from invoices JOIN invoice_lines
    ON invoices.id = invoice_lines.invoice_id

SQL достаточно подробен, но не делает его более многословным.

Вы знаете, поддерживает ли SQL Server естественное соединение?

Arry 16.10.2008 19:01

Я не думаю, что это так. Согласно connect.microsoft.com/SQLServer/feedback/…, похоже, что синтаксис планируется добавить в какую-то версию после SQL Server 2005. Я знаю, что он работает в PostgreSQL и в Oracle.

Steven Huwig 16.10.2008 19:19

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

Mark Brady 17.10.2008 17:50

хех, звучит как реальный опыт :)

dland 18.10.2008 01:32

Я бы использовал естественное соединение только для специальных запросов.

Steven Huwig 18.10.2008 05:09

SQL Server 2008 по-прежнему не имеет естественного соединения.

Arry 22.10.2008 14:18

Я думаю, вы можете использовать что угодно в качестве «идентификатора», если будете последовательны. Включение имени таблицы важно. Я бы предложил использовать инструмент моделирования, такой как Erwin, для обеспечения соблюдения соглашений и стандартов именования, чтобы при написании запросов было легко понять отношения, которые могут существовать между таблицами.

Под первым утверждением я подразумеваю, что вместо идентификатора вы можете использовать что-то другое, например recno. Тогда в этой таблице будет PK invoice_recno и так далее.

Ваше здоровье, Бен

В последнее время в моей компании велась борьба ботаников из-за этого. Появление LINQ сделало избыточный шаблон имя таблицы + идентификатор еще более глупым в моих глазах. Я думаю, что большинство разумных людей скажут, что если вы вручную пишете свой SQL таким образом, что вам нужно указать имена таблиц, чтобы различать ФК, тогда это не только экономит на вводе, но и добавляет ясности в ваш SQL, чтобы использовать только ID, в котором вы можете ясно видеть, какой из них является ПК, а какой - FK.

Например.

ОТ сотрудников e ЛЕВЫЙ ПРИСОЕДИНЯЙТЕСЬ к клиентам c ON e.ID = c.EmployeeID

говорит мне не только о том, что они связаны, но и о том, что это ПК, а которое FK. Тогда как в старом стиле приходится либо смотреть, либо надеяться, что их правильно назвали.

За исключением того, что я никогда в жизни не встречал ни одного разработчика, который написал бы ваш пример. Вместо этого они пишут: LEFT JOIN Customers как c ON e.ID = c.EmployeeID Для меня это яснее: LEFT JOIN Customers как c ON e.EmployeeID = c.EmployeeID И какой элемент является внешним ключом, очевидно по имени таблицы . очевидно, customer.employeeId - это внешний ключ, а employee.employeeId - нет.

dallin 06.03.2013 05:11

Множеству людей (например, составителей отчетов, которые пишут очень сложные sql) и специалистов по бизнес-аналитике, выполняющих импорт и экспорт, по-прежнему необходимо писать SQl от руки. Дизайн базы данных должен учитывать и их, а не только разработчиков приложений.

HLGEM 07.10.2013 21:11

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

 Select Invoice.InvoiceID, Lines.InvoiceLine, Customer.OrgName
 From Invoices Invoice
 Join InvoiceLines Lines on Lines.InvoiceID = Invoice.InvoiceID
 Join Customers Customer on Customer.CustomerID = Invoice.CustomerID

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

Исходя из этого с точки зрения формального словаря данных, я бы назвал элемент данных invoice_ID. Как правило, имя элемента данных будет уникальным в словаре данных и в идеале будет иметь одно и то же имя повсюду, хотя иногда могут потребоваться дополнительные уточняющие термины в зависимости от контекста, например элемент данных с именем employee_ID может использоваться дважды в организационной диаграмме и, следовательно, квалифицироваться как supervisor_employee_ID и subordinate_employee_ID соответственно.

Очевидно, что соглашения об именах субъективны и зависят от стиля. Я считаю, что рекомендации ISO / IEC 11179 могут быть полезной отправной точкой.

Для СУБД я вижу таблицы как коллекции объектов (кроме тех, которые содержат только одну строку, например, таблица cofig, таблица констант и т. д.), Например. таблица, в которой мой employee_ID является ключом, будет называться Personnel. Так что сразу соглашение TableNameID у меня не работает.

Я видел, что стиль TableName.ID=PK TableNameID=FK используется в больших моделях данных, и должен сказать, что меня это немного сбивает с толку: я предпочитаю, чтобы имя идентификатора было одинаковым во всем, т.е. не меняло имя в зависимости от того, в какой таблице оно появляется. - вышеупомянутый стиль, похоже, используется в магазинах, которые добавляют столбец IDENTITY (автоинкремент) в таблицу каждый, избегая при этом естественных и составных ключей во внешних ключах. Эти магазины, как правило, не имеют официальных словарей данных и не основываются на моделях данных. Опять же, это просто вопрос стиля, и я лично не подписываюсь под ним. Так что в конечном итоге это не для меня.

Все это говорит о том, что я вижу случай, когда иногда удаляют квалификатор из имени столбца, когда имя таблицы предоставляет контекст для этого, например. элемент с именем employee_last_name может стать просто last_name в таблице Personnel. Обоснованием здесь является то, что домен - это `` фамилии людей '' и, скорее всего, будет UNIONed с last_name столбцами из других таблиц, а не будет использоваться в качестве внешнего ключа в другой таблицы, но опять же ... Я могу просто передумать , иногда никогда не скажешь. В том-то и дело: моделирование данных - это отчасти искусство, отчасти наука.

Я предпочитаю DomainName || 'Я БЫ'. (например, DomainName + ID)

Имя домена часто, но не всегда, совпадает с именем таблицы.

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

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

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

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

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

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

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

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

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

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

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

Что я делаю, чтобы поддерживать единообразие для себя (когда таблица имеет один первичный ключ столбца, используемый в качестве идентификатора), так это называть первичный ключ таблицы Table_pk. Везде, где у меня есть внешний ключ, указывающий на первичный ключ этой таблицы, я называю столбец PrimaryKeyTable_fk. Таким образом, я знаю, что если у меня есть Customer_pk в моей таблице клиентов и Customer_fk в моей таблице заказов, я знаю, что таблица заказов ссылается на запись в таблице клиентов.

Для меня это имеет смысл, особенно для тех объединений, где я думаю, что это легче читать.

SELECT * 
FROM Customer AS c
    INNER JOIN Order AS c ON c.Customer_pk = o.Customer_fk

FWIW, наш новый стандарт (который меняется, я имею в виду «развивается» с каждым новым проектом):

  • Имена полей базы данных в нижнем регистре
  • Имена таблиц в верхнем регистре
  • Используйте подчеркивания для разделения слов в имени поля - преобразуйте их в регистр Паскаля в коде.
  • Префикс pk_ означает первичный ключ
  • Суффикс _id означает целочисленный идентификатор с автоинкрементом.
  • Префикс fk_ означает внешний ключ (суффикс не требуется)
  • Суффикс _VW для просмотров
  • Префикс is_ для логических значений

Итак, таблица с именем NAMES может иметь поля pk_name_id, first_name, last_name, is_alive, и fk_company и представление с именем LIVING_CUSTOMERS_VW, определенное следующим образом:

SELECT first_name, last_name
FROM CONTACT.NAMES
WHERE (is_alive = 'True')

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

Я только начал работать в месте, которое использует только «ID» (в основных таблицах, на которые ссылается TableNameID во внешних ключах), и уже обнаружил ДВЕ производственные проблемы, непосредственно вызванные этим.

В одном случае запрос использовал «... где ID в (SELECT ID FROM OtherTable ...») вместо «... where ID in (SELECT TransID FROM OtherTable ...».

Может ли кто-нибудь честно сказать, что это было бы намного легче обнаружить, если бы использовались полные, согласованные имена там, где неправильный оператор читал бы «... где TransID in (SELECT OtherTableID from OtherTable ...»? Я не думаю так.

Другая проблема возникает при рефакторинге кода. Если вы используете временную таблицу, тогда как ранее запрос выполнялся из базовой таблицы, тогда старый код читается как «... dbo.MyFunction (t.ID) ...», и если это не изменилось, то «t» теперь относится к временную таблицу вместо основной, вы даже не получите ошибку - просто ошибочные результаты.

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

+1 для реального примера более конкретного имени, улучшающего ремонтопригодность.

codingoutloud 21.11.2012 21:41

Я предпочитаю также ID для первичного ключа и TableNameID для внешнего ключа. Мне также нравится иметь столбец «имя» в большинстве таблиц, где я храню читаемый пользователем идентификатор (например, имя :-)) записи. Эта структура обеспечивает большую гибкость в самом приложении, таким же образом я могу обрабатывать массу таблиц. Это мощная штука очень. Обычно объектно-ориентированное программное обеспечение создается поверх базы данных, но набор инструментов объектно-ориентированного проектирования не может быть применен, потому что сама база данных не позволяет этого. Иметь идентификатор и имя столбца - это еще не очень хорошо, но это шаг.

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

Почему я не могу этого сделать?

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

На мой взгляд, это очень удобно и просто. Называть переменные как i и il в целом - плохой выбор.

Ответ принят как подходящий

ID - это антипаттерн SQL. См. http://www.amazon.com/s/ref=nb_sb_ss_i_1_5?url=search-alias%3Dstripbooks&field-keywords=sql+antipatterns&sprefix=sql+a

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

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

Если вы хотите использовать синтаксис USING, разрешенный некоторыми базами данных, вы не можете использовать ID.

Если вы используете ID, вы можете легко получить ошибочное соединение, если случайно копируете синтаксис соединения (не говорите мне, что никто никогда этого не делает!) И забудьте изменить псевдоним в условии соединения.

Итак, теперь у вас есть

select t1.field1, t2.field2, t3.field3
from table1 t1 
join table2 t2 on t1.id = t2.table1id
join table3 t3 on t1.id = t3.table2id

когда ты имел в виду

select t1.field1, t2.field2, t3.field3 
from table1 t1 
join table2 t2 on t1.id = t2.table1id
join table3 t3 on t2.id = t3.table2id

Если вы используете tablenameID в качестве поля идентификатора, вероятность возникновения такой случайной ошибки гораздо меньше, и ее гораздо легче найти.

@ spencer7593, если вам нравится ID, это не значит, что это не антипаттерн. Когда у вас есть идентификатор tablename, труднее делать ошибки в соединениях, потому что вы сразу получите синтаксическую ошибку.

HLGEM 11.07.2012 00:15

@ spencer7593, вы также заметите, что Включите ссылку на книгу, написанную экспертом по SQKL, которая поддерживает мой тезис. Где ваше оправдание для использования удостоверения личности помимо личных предпочтений?

HLGEM 11.07.2012 00:17

+1 Столбцы, которые являются синонимами, должны иметь одно и то же имя - используя префикс имени таблицы, вы можете иметь столбец первичного ключа с именем table1ID и столбец внешнего ключа в другой таблице с именем table1ID - и вы ЗНАЕТЕ, что это одно и то же. Меня этому учили 20 лет назад, и эта практика вас не подведет.

amelvin 30.07.2012 13:18

НЕТ! Это соглашение об именах смурфов!

Ross 25.09.2012 23:31

@ Росс, что это значит?

HLGEM 26.09.2012 00:05

Я считаю, что @Ross получил это от codinghorror.com/blog/2012/07/new-programming-jargon.html, который, в свою очередь, был внесен @ sal (stackoverflow.com/users/13753/sal), но я бы сказал, что это НЕ в этом случае - вы не задаете префиксы всего, только поле идентификатора, и между разными таблицами у вас разные префиксы .

Oskar Austegard 28.11.2012 08:05

Мне не нравится это соглашение, потому что оно просто означает, что вы практически вынуждены использовать псевдонимы для всех своих таблиц, чтобы не было избыточного именования таблицы, повторного именования таблицы и последующего добавления идентификатора. join table2 on table1.table1id = table2.table1id. Ваше рассуждение в порядке, за исключением того, что если вы используете идентификатор, имя таблицы в любом случае будет перед идентификатором. join table2 on table1.id = table2.table1id ... который так же подробен и не избыточен, и не заставляет неясные псевдонимы предотвращать только что упомянутую избыточность ... что, на мой взгляд, является проклятием разработки sql.

Anther 15.03.2013 22:35

@anthr, если бы вы каждый раз писали запрос без псевдонима каждого поля, я бы провалил вас при проверке кода !!! Это очень важно для последующего обслуживания.

HLGEM 15.03.2013 23:01

Затем, если у вас есть поле Name в таблице, следует ли вам изменить его на Table1Name, чтобы избежать тех же проблем с этим полем? Следует ли по той же причине ставить перед всеми столбцами префикс имени таблицы? Звучит неправильно.

Joanvo 17.09.2015 10:35

"select *" сам по себе является антипаттерном. Совсем не похоже на вескую причину.

Roman Polunin 16.02.2017 04:26

@RomanPolunin, вы правы, SELECT * - это антипаттерн, и мне не следовало использовать его в моем примере. Однако это не имеет ничего общего с причинами, по которым использование идентификатора в качестве поля идентификатора - плохая идея.

HLGEM 16.02.2017 17:42

Некоторые даже доходят до использования имен, разделенных подчеркиванием. Пример: Table1_ID

alans 24.01.2019 20:20

Однако использование идентификатора также имеет много преимуществ. В ASP.net MVC столбец идентификатора считается ключом для скаффолдера и в других ситуациях. Он также стандартен и позволяет упростить использование универсальных шаблонов, автоматически сгенерированный SQL и всегда явно является первичным ключом. Лично я перешел на Id несколько лет назад и доволен этим решением.

niico 22.06.2020 16:21

Что касается TableName_fieldname, я имею дело с базой данных, которая делает это сейчас. Это делает все запросы ужасно повторяющимися и намного длиннее текста, чем требуется. Если вы смотрите на таблицу в визуальном приложении (студия управления сервером sql), все, что вы видите, - это имя таблицы в начале каждого столбца с обрезанной остальной частью. Я также думаю, что Select * великолепен, поскольку он сокращает код, а это означает, что вам не нужно постоянно добавлять поля в запросы и т. д. - это устаревшее отношение цитат ИМХО. При использовании ORM Select * очень выгоден.

niico 22.06.2020 16:23

Для всех, кто приходит сюда за советом и ожидает этого ответа, потому что он был «принят»: я призываю вас подсчитать голоса по другим ответам, которые противоречат этому.

Joshua Schlichting 13.09.2020 01:26

Я согласен с Кевеном и несколькими другими людьми здесь, что PK для таблицы должен быть просто Id, а внешние ключи перечисляют OtherTable + Id.

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

В моей текущей должности мы используем структуру сущностей с использованием генерации POCO. Используя стандартное соглашение об именах Id, PK позволяет наследовать базовый класс poco с проверкой и тому подобное для таблиц, которые имеют набор общих имен столбцов. Использование Tablename + Id в качестве PK для каждой из этих таблиц лишает возможности использовать для них базовый класс.

Просто пища для размышлений.

+1 для реального примера того, как универсальное именование улучшает повторное использование кода в конкретном случае (об этом позаботятся многие разработчики, поскольку существуют миллионы разработчиков .NET, и многие будут использовать EF).

codingoutloud 21.11.2012 21:44

В моей работе не только EF и тому подобное, у нас есть много общих методов. Таким образом, веб-сервис будет иметь что-то вроде List <Result> Save <T> (List <int> Ids); Поскольку мы знаем, что каждая таблица имеет столбец Id, который является первичным ключом, мы можем делать такие вещи, просто отображая объекты C# в их таблицы (что-то вроде <Customer, "Customers">, <BillingCode, "BillingCodes"> ( или, еще лучше, сохраненные имена процессов), генерируйте sql на лету на основе переданного объекта и вуаля никаких повторных методов сохранения / удаления / редактирования для каждого типа объекта.

Mike 23.06.2013 07:58

Я лично предпочитаю (как было указано выше) Table.ID для ПК и TableID для FK. Даже (пожалуйста, не стреляйте в меня) Microsoft Access рекомендует это.

ОДНАКО, я ТАКЖЕ знаю, что некоторые инструменты генерации предпочитают TableID для PK, потому что они склонны связывать все имена столбцов, которые содержат 'Я БЫ' в слове, ВКЛЮЧАЯ ID !!!

Даже конструктор запросов делает это на Microsoft SQL Server (и для каждого создаваемого вами запроса вы в конечном итоге отбрасываете все ненужные вновь созданные отношения во всех таблицах по идентификатору столбца)

ТАК Как бы мое внутреннее ОКР это не ненавидело, я придерживаюсь соглашения TableID. Давайте вспомним, что он называется Data ОСНОВАНИЕ, так как он будет базой для многих будущих приложений. И все технологии должны иметь хорошо нормализованную с четким описанием схему.

Само собой разумеется, что я ДЕЙСТВУЮ, когда люди начинают использовать TableName, TableDescription и тому подобное. На мой взгляд, конвенции должны делать следующее:

  • Название таблицы: во множественном числе. Бывший. Сотрудники
  • Псевдоним таблицы: полное имя таблицы в единственном числе. Бывший.

    SELECT Employee.*, eMail.Address
    FROM Employees AS Employee LEFT JOIN eMails as eMail on Employee.eMailID = eMail.eMailID -- I would sure like it to just have the eMail.ID here.... but oh well
    

[Обновлять]

Кроме того, в этой ветке есть несколько валидных сообщений о дублированных столбцах из-за «родства» или роли. Например, если в магазине есть EmployeeID, это говорит мне о приседании. Поэтому я иногда делаю что-то вроде Store.EmployeeID_Manager. Конечно, он немного больше, но, по крайней мере, люди не сойдут с ума, пытаясь найти таблица ManagerID или то, что EmployeeID там делает. При запросе WHERE я бы упростил его как: ВЫБЕРИТЕ EmployeeID_Manager как ManagerID из магазина

Я думаю, что ваша точка зрения хороша для красоты и дидактических целей базы данных, но для функциональности я думаю, что это проблема. Множественное число имен таблиц способствует несогласованности между таблицами, а PK Id <-> FK IdTable создает различия в имени одного и того же объекта. В то же время что-то вроде User.UserId довольно странно набирать при программировании.

Machado 09.08.2017 06:17

Другие вопросы по теме