Соглашения об именах баз данных, таблиц и столбцов?

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

  1. Должны ли имена таблиц быть во множественном числе?
  2. Должны ли имена столбцов быть в единственном числе?
  3. Стоит ли добавлять префиксы к таблицам или столбцам?
  4. Следует ли использовать регистр при именовании предметов?

Существуют ли какие-либо рекомендуемые правила для именования элементов в базе данных?


person GateKiller    schedule 11.08.2008    source источник
comment
Я думаю, нам следует называть таблицы во множественном числе, а столбцы - в единственном числе.   -  person AZ_    schedule 05.05.2011
comment
Я вижу таблицу как хранилище с несколькими элементами, а не с одним объектом, поэтому я называю ее множественным числом. Когда я отображал таблицы в объекты, я бы назвал эти объекты единичными. Это только моё личное мнение.   -  person dpp    schedule 19.07.2013
comment
@Tryinko Повсеместное использование идентификаторов - это ЖИВОЙ АД для всех, кто объединяет несколько таблиц. Невозможно, чтобы небольшое преимущество знания, что это ПК, перевешивает невероятное раздражение повторного изменения псевдонима столбца идентификатора опасности в каждом кровавом запросе снова и снова. Если вам нужен способ обозначения PK в таблице, сделайте его первым столбцом. Кроме того, обозначение FK в именах столбцов, на мой взгляд, является еще одним злобным антипаттерном.   -  person ErikE    schedule 03.02.2016
comment
Прочтите этот ответ.   -  person PerformanceDBA    schedule 06.02.2019


Ответы (23)


Я рекомендую ознакомиться с образцами баз данных Microsoft SQL Server: https://github.com/Microsoft/sql-server-samples/releases/tag/adventureworks

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

  1. Единичные имена для таблиц
  2. Единичные имена для столбцов
  3. Имя схемы для префикса таблиц (например: SchemeName.TableName)
  4. Кожух Паскаля (он же верхний регистр верблюда)
person urini    schedule 11.08.2008
comment
А как насчет хранимых процедур и функций - person adopilot; 22.01.2010
comment
@ Стю Томпсон: Похоже, он говорит, что используйте имя схемы вместо префикса, так вы уверены, что -1? - person ErikE; 28.01.2010
comment
@Emtucifor: Честный улов. Я интерпретировал это как обозначение таблиц с именем production_BillOfMatterials. Я отредактировал ответ urini для пояснения (и чтобы я мог отменить свой голос "против"). На самом деле, найти настоящие имена таблиц AdventureWorks, если их нет в Windows, - нетривиальная попытка! - person Stu Thompson; 28.01.2010
comment
wilsonmar.com/sql_adventureworks.htm - отличный анализ схемы AdventureWorks. - person Daniel Trebbien; 11.01.2011
comment
Я бы не стал полагаться на Microsoft ни в каком стандарте - если вы посмотрите на их базу данных Northwind, вы увидите, что они используют множественные таблицы, имена одиночных столбцов, префиксы схемы для таблиц, префиксы таблиц для столбцов первичного ключа, префиксы ограничений в венгерском стиле и худшее. всех ПРОБЕЛОВ для имен таблиц, состоящих из нескольких слов. Кроме того, в системных таблицах для SQLServer используется множественное число, поэтому кажется, что AdventureWorks была белой вороной в этой связке. - person Marcus Pope; 21.03.2012
comment
Я думаю, что основная проблема здесь в том, что толпа с именами таблиц в единственном числе, похоже, рассматривает таблицу как сущность, а не строку в таблице, как это делает толпа во множественном числе. Вы должны спросить себя, что это такое. Если таблица - это просто контейнер строк, не логичнее ли использовать множественное именование? Вы бы никогда не назвали коллекцию в коде единичным числом, тогда почему вы назвали бы таблицу единичным числом? Почему несогласованность? Я слышу все аргументы о том, как они сортируют и используют в объединениях, но все они кажутся очень хлипкими аргументами. Если все сводится к предпочтениям, я буду придерживаться последовательности и множественного числа. - person Jason; 10.04.2012
comment
Также подумайте, в каком направлении идет прилив. Похоже, что это идет в направлении множественного числа имен таблиц, тем более что все системные таблицы в SQL Server все множественные, а значение по умолчанию для Entity Framework - множественное число из коробки. Если это позиция Microsoft, я хочу двигаться в том направлении, в котором мы будем через 20 лет. Даже в соглашениях Oracle о базах данных имена таблиц указаны во множественном числе. Только подумайте, сколько разработчиков C # ненавидели ключевое слово var, когда оно было введено, теперь это широко распространенный способ определения переменных. - person Jason; 10.04.2012
comment
Я рад, что правильный ответ попал в топ. Подумайте об этом так ... как вы называете контейнер, в котором хранятся другие вещи? Стол - это контейнер-ряд ... как мешок с камнями, банка с червями. - person Jasmine; 06.07.2012
comment
@ Жасмин: а вы называете свои столы Bag and Can или Rock and Worm? Имена таблиц часто называются в соответствии с тем, что они содержат (в этом примере - последняя пара вариантов), а не с каким-либо именем контейнера (первая пара). Называть контейнер Rocks просто Rock не имеет никакого смысла для толпы, предпочитающей множественное число. - person Derek; 02.03.2013
comment
@ Дерек, нет, дело в том, что вы называете контейнером - вы не говорите «мешки с камнями», если нет более одного мешка. Так как было бы излишним называть наши таблицы, например, TableOfInvoices, мы помечаем таблицы именами содержащихся в них объектов - поэтому таблица называется Invoice, потому что она определяет контейнер для счетов, и есть только один контейнер для счетов, который называется Invoice. . - person Jasmine; 05.03.2013
comment
@Jasmine - я понимаю вашу точку зрения, хотя я думаю, что вы случайно назвали свою таблицу примеров в обратном порядке. TableOfInvoices следует сократить до Invoices, что я предпочитаю. Вы, вероятно, имели в виду InvoiceTable, что имеет смысл сократить Invoice. - person Derek; 05.03.2013
comment
Это, вероятно, старая мода, но я предпочитаю использовать нижний регистр с подчеркиванием для именования элементов, чтобы избежать каких-либо проблем при переключении между системами с учетом нижнего регистра или нет (например: Linux / Windows). - person L. G.; 19.03.2013
comment
@Jason Толпа с единственными именами таблиц рассматривает таблицу базы данных как абстракцию сущности и эквивалент класса в коде приложения. Затем мы переходим к обсуждению абстрактного представления и физического представления. - person ulty4life; 30.10.2014
comment
@Urini говорит только о том, что AdventureWorks - прекрасная база данных. И я предпочитаю использовать стандарты MS при использовании технологий MS, потому что их будут использовать другие разработчики MS. По определению, это то, что делает его стандартом: все его используют. Проблема, которую я вижу при использовании стандартов MS, заключается в том, что это движущаяся цель. В былые времена они предпочитали венгерскую нотацию. В DotNet его отменили. Они опубликовали образец базы данных AdventureWorks, в которой для таблиц используются единственные имена. В Current Entity Framework по умолчанию включено множественное число, при котором для таблиц используются имена во множественном числе. Раздражающий. - person woodvi; 24.04.2015
comment
Ссылка мертва ... - person Burrito; 18.02.2018
comment
Консультации по именам единичных сущностей восходят к исчислению кортежей, которое является теорией, на которой основана СУБД. Поскольку в настоящее время большинство разработчиков баз данных создают схемы без вычислений, это становится немного искусственным. Что касается пробелов в именах столбцов или таблиц: все базы данных предлагают какую-то цитату, и рекомендуется всегда использовать обратные кавычки (выберите ID из _2 _._ 3_) по той единственной причине, что это позволяет именовать объект size или with и т. Д. знает, что станет зарезервированным словом в будущем, и если вы этого не сделаете, это может сломать ваш потрясающий дизайн. - person theking2; 16.04.2019

Поздний ответ здесь, но вкратце:

  1. Имена таблиц во множественном числе: я предпочитаю использовать множественное число
  2. Имена столбцов в единственном числе: Да
  3. Таблицы или столбцы префиксов:
  • Таблицы: * Обычно * без префиксов лучше.
  • Столбцы: нет.
  1. Используйте любой регистр в именах элементов: PascalCase как для таблиц, так и для столбцов.

Доработка:

(1) Что вы должны делать. Есть очень мало вещей, которые вы должны делать каждый раз определенным образом, но есть несколько .

  • Назовите свои первичные ключи в формате идентификатора [singularOfTableName]. То есть независимо от того, является ли ваша таблица именем Customer или Customers, первичным ключом должен быть CustomerID.
  • Кроме того, внешние ключи должны иметь одинаковые имена в разных таблицах. Должно быть законным право избивать того, кто этого не делает. Я хотел бы заявить, что, хотя определенные ограничения внешнего ключа часто важны, согласованное именование внешнего ключа всегда важно.
  • Ваша база данных должна иметь внутренние соглашения. Хотя в следующих разделах вы увидите, что я очень гибкий, внутри именование базы данных должно быть очень последовательным. Менее важно, называется ли ваша таблица для клиентов Customers или Customer, чем то, что вы делаете это одинаково во всей той же базе данных. И вы можете подбросить монетку, чтобы определить, как использовать символы подчеркивания, но тогда вы должны продолжать использовать их одинаково. Если вы этого не сделаете, вы плохой человек, у которого должна быть низкая самооценка.

(2) Что вам, вероятно, следует делать.

  • Поля, представляющие одинаковые данные в разных таблицах, должны называться одинаково. Не устанавливайте Zip на одном столе и ZipCode на другом.
  • Чтобы разделить слова в именах таблиц или столбцов, используйте PascalCasing. Использование camelCasing по сути не было бы проблемой, но это не соглашение, и это выглядело бы забавно. Я обращусь к символам подчеркивания через минуту. (Вы не можете использовать ALLCAPS, как в былые времена. OBNOXIOUSTABLE.ANNOYING_COLUMN было нормально в DB2 20 лет назад, но не сейчас.)
  • Не сокращайте и не сокращайте слова искусственно. Лучше, чтобы имя было длинным и ясным, чем коротким и запутанным. Ультракороткие имена - это пережиток более темных и жестоких времен. Cus_AddRef. Что это за чертовщина? Ссылка на адресата-хранителя? Дополнительный возврат клиенту? Настраиваемый адресный переход?

(3) Что следует учесть.

  • Я действительно считаю, что у таблиц должно быть множественное число; некоторые думают, что это нечто особенное. Прочтите аргументы в другом месте. Однако имена столбцов должны быть в единственном числе. Даже если вы используете имена таблиц во множественном числе, таблицы, представляющие комбинации других таблиц, могут быть в единственном числе. Например, если у вас есть таблица Promotions и Items, таблица, представляющая элемент, являющийся частью рекламной акции, может быть Promotions_Items, но она также может законно быть Promotion_Items I думать (отражая отношения «один ко многим»).
  • Используйте символы подчеркивания последовательно и для определенной цели. Просто общие имена таблиц должны быть достаточно ясными с PascalCasing; для разделения слов символы подчеркивания не нужны. Сохраните символы подчеркивания (а) для обозначения ассоциативной таблицы или (б) для префикса, о котором я расскажу в следующем пункте.
  • Приставка - это ни хорошо, ни плохо. Это обычно не самое лучшее. В ваших первых или двух базах данных я бы не предлагал использовать префиксы для общей тематической группировки таблиц. Таблицы в конечном итоге не соответствуют вашим категориям, и это может фактически сделать поиск таблиц сложнее. Имея опыт, вы можете спланировать и применить схему префиксов, которая принесет больше пользы, чем вреда. Однажды я работал в базе данных, где таблицы данных начинались с tbl, таблицы конфигурации с ctbl, представления с vew, proc sp и fn udf и некоторые другие; его применяли тщательно и последовательно, так что все прошло хорошо. Единственный раз, когда вам НУЖНЫ префиксы, это когда у вас действительно отдельные решения, которые по какой-то причине находятся в одной базе данных; их префикс может быть очень полезным при группировании таблиц. Префикс также подходит для особых ситуаций, например, для временных таблиц, которые вы хотите выделить.
  • Очень редко (если вообще когда-либо) вы хотите использовать префикс столбцов.
person Patrick Karcher    schedule 22.01.2010
comment
Поля, представляющие одинаковые данные в разных таблицах, должны называться одинаковыми. Не устанавливайте Zip на одном столе и ZipCode на другом. Да да миллион раз да. Можете ли вы сказать, что наша база данных не была разработана таким образом? На персонажа можно ссылаться любым из десятка разных способов, что очень утомительно в обслуживании. Я всегда придерживался этого правила в любой базе данных, над созданием которой я имел контроль, и это значительно упрощает жизнь. - person HLGEM; 26.03.2010
comment
Я думаю, что первичным ключом должен быть просто ID. Такое простое соглашение делает первичный ключ предсказуемым и быстро идентифицируемым. Однако я бы добавил имя таблицы (PersonID), когда оно используется в качестве внешнего ключа в других таблицах. Это соглашение может помочь различать первичный ключ и внешние ключи в одной и той же таблице. - person Triynko; 02.04.2010
comment
@Tryinko Повсеместное использование идентификаторов - это ЖИВОЙ АД для всех, кто объединяет несколько таблиц. Невозможно, чтобы небольшое преимущество знания, что это ПК, перевешивает невероятное раздражение повторного изменения псевдонима столбца идентификатора опасности в каждом кровавом запросе снова и снова. Если вам нужен способ обозначения PK в таблице, сделайте его первым столбцом. Кроме того, обозначение FK в именах столбцов, на мой взгляд, является еще одним злобным антипаттерном. - person ErikE; 21.06.2011
comment
@Triynko, если вы используете только идентификатор, также становится программно невозможно определить таблицу, к которой он принадлежит. С помощью префикса имени таблицы вы можете просто отрезать две последние цифры первичного ключа и узнать имя таблицы, к которой она принадлежит, с помощью кода. Часто ИТ-специалисты и администраторы баз данных не осознают, что при разработке баз данных определенным образом существуют преимущества программирования для программистов. - person dallin; 30.04.2013
comment
Я согласен с Трийнко - с первичным ключом id в таблице людей таблица клиентов имеет собственное поле id в качестве первичного ключа, а также поле personId, которое явно является внешним ключом в таблице людей. Это очень интуитивно понятная структура базы данных. Переменные именуются в соответствии с тем же соглашением. - person Thomas Fonseca; 16.12.2015
comment
@ErikE Я не понимаю, насколько Customer.ID сложнее, чем CustomerID, на самом деле это даже яснее, поскольку вы знаете, что это первичный ключ Customer. Customer.CustomerID также является избыточным. - person Dave Cousineau; 03.02.2016
comment
@Sahuagin Вы не можете понять, что CustomerID - это PK Customer? Зачем использовать псевдонимы полного имени вместо c для Customer? Почему вы хотите избежать дублирования c.CustomerID только для того, чтобы получить дублирование _6 _!?!?!?! Для меня это безумие, когда ты мог просто SELECT c.CustomerID, c.UserID, c.ShippingID. - person ErikE; 03.02.2016
comment
@ErikE Я имею в виду, что вы не знаете, является ли CustomerID первичным ключом из таблицы Customer или внешним ключом в какой-то другой таблице. Это мелочь. Зачем вам использовать плохие имена, такие как c? CustomerID = Customer.ID очень ясно, поскольку вы видите, что вы соединяете внешний ключ с первичным ключом; это не является лишним, поскольку две стороны - это две разные вещи. Именование одного символа - плохая практика IMO. - person Dave Cousineau; 03.02.2016
comment
@Sahuagin, причина в том, что имя таблицы не является очень сильным сигналом в запросе, который легко понять - скорее, это больше похоже на шум. Намного лучше использовать короткие псевдонимы и увеличивать отношение сигнал / шум в запросе. Я не могу ВИДЕТЬ, что происходит, когда есть гигантский блок полноразмерных псевдонимов, портящих большое предложение выбора, а с короткими псевдонимами имена столбцов всплывают и становятся видимыми. Полноразмерный псевдоним - плохая практика IMO, потому что он обслуживает новичков / новичков, а не тех, кто понимает схему базы данных. - person ErikE; 03.02.2016
comment
@Sahuagin Края дают более сильный семантический запах, чем середины, а полноразмерные псевдонимы загрязняют края простой информацией об объеме, которая разбавляет гораздо более важную информацию, которая в противном случае могла бы быть ближе к краям текста (наиболее важно левый край, а второй - правый край. большинство и вокруг текстовых разделителей с пробелами, такими как `=`, и других разделителей, которые мозг может зафиксировать, чтобы обеспечить мгновенное распознавание образов). - person ErikE; 03.02.2016
comment
@ErikE Разве весь смысл удобочитаемости не в первую очередь для новичков? Он должен быть особенно удобочитаемым для людей, менее знакомых с ним. Если вы правильно отформатируете и организуете свой код, имена таблиц будут ясными, они не запутываются. Кроме того, использование имени таблицы необходимо только для устранения неоднозначности повторяющихся имен столбцов между таблицами. - person Dave Cousineau; 03.02.2016
comment
@Sahuagin Нет, код должен быть ясным, но ясность зависит от контекста домена. Моей маме не нужно разбираться в коде SQL, и планировщику проекта не обязательно разбираться в этом. Но это нужно уметь и новичку, и опытному разработчику. Удовлетворение потребностей исключительно новичков означает, что 85% вашей карьеры будет связано с грязью. Однажды я работал с базой данных с именами таблиц tblTable, tlkLookupTable и tinIntersectTable и именами столбцов keyTableId, frnkeyTableId. Это пошло на пользу новичкам, но было глупо. - person ErikE; 03.02.2016
comment
Позвольте нам продолжить это обсуждение в чате. - person ErikE; 03.02.2016
comment
It should be legal to beat up someone who does not do this. - просто сделал мой день, лол. - person ViRuSTriNiTy; 23.06.2016
comment
Лучшая система, которую я когда-либо видел или использовал, заключалась в том, чтобы дать каждой таблице 4-символьное сокращение для использования с ключами. Первичный ключ клиента будет cust_id. Первичный ключ заказов будет ordr_id. Внешний ключ от заказов к клиентам будет ordr_cust_id. С точки зрения dba, это мечта - управлять ссылочной целостностью и писать соединения, особенно для массивных баз данных, в отличие от игрушечных, с которыми работает большинство людей. - person m12lrpv; 19.12.2016
comment
Я согласен с @dallin. Всегда используйте customers_id вместо customers.id. Это делает имя столбца уникальным для всех таблиц, что не только хорошо для понимания, но также позволяет использовать USING(customers_id) для JOIN, делая их более лаконичными. - person DanMan; 21.01.2017
comment
IMHO, использование префиксов столбцов - отличная идея, особенно если вы ленивы. Трехбуквенные префиксы столбцов позволят вам не добавлять префиксы столбцов 20 раз в большом запросе с именем таблицы Ltn_id проще писать, чем LongTableName.Id - person Radacina; 13.07.2017
comment
Поздно к вечеринке, не одобряют ли добавление префикса к таблице, чтобы они были сгруппированы вместе? - person Drewdin; 04.09.2019

Хорошо, раз уж мы придерживаемся мнения:

Я считаю, что имена таблиц должны быть во множественном числе. Таблицы - это совокупность (таблица) сущностей. Каждая строка представляет собой одну сущность, а таблица представляет собой коллекцию. Поэтому я бы назвал таблицу сущностей Person людьми (или людьми, как вам нравится).

Для тех, кто любит видеть в запросах единичные "имена сущностей", я бы использовал псевдонимы таблиц для:

SELECT person.Name
FROM People person

Немного похоже на LINQ «от человека к людям выбирают person.Name».

Что касается 2, 3 и 4, я согласен с @Lars.

person Matt Hamilton    schedule 11.08.2008
comment
@John Topley: Готов поспорить, вы не говорите, что данные есть, и, следовательно, у вас не должно быть реальных концептуальных проблем с вещами, которые несколько называются одним единственным именем. Если вы хотите называть вещи множественным числом, я рассматриваю это как простое предпочтение, которое не связано с количеством строк в таблице. Если бы вы увидели базу данных, полную уникальных имен таблиц, таких как Person, Invoice, Address и т. Д., Вы действительно запутались бы и подумали, что в каждой из них есть только одна строка? - person ErikE; 28.01.2010
comment
@Emtucifor: По-английски мы не говорим «Посмотри на всех, кто находится в этой толпе!» Следует ожидать концептуальной проблемы с множественными вещами, которые упоминаются одним словом. Это ни обычно, ни прилично. Данные являются исключительными и часто используются для обозначения части объема вещества, как пирога. Хотите (кусок) торта? Назвать таблицу «Люди», поскольку она содержит информацию о нескольких лицах, имеет гораздо больше смысла, чем называть ее «Персон». Класс данных с именем Person для ROW имеет смысл, как и имена столбцов в единственном числе. - person Triynko; 01.04.2010
comment
@Triynko Я думаю, все это определяет, как вы думаете о таблицах и как вы их используете. Имена таблиц используются в запросах; Правильно ли они вписываются в определенный жесткий шаблон предложений на английском языке - зависит от ваших личных предпочтений. Вот английское предложение, которое без проблем решает ваши грамматические возражения: дайте мне все строки Person из одноименной таблицы. В любом случае, я хочу сказать, что ваш концептуальный / языковой аргумент не является автоматическим или глобальным - это просто то, как вам нравится думать об этом. Другие способы столь же логичны. - person ErikE; 06.04.2010
comment
@Emtucifor: В конце концов, любой язык условен и условен. Я просто утверждал, что обычно мы называем набор элементов множественным числом от типа элемента в нем. Таким образом, набор строк, каждая из которых содержит информацию об одном человеке, будет называться набором People. Но если вы хотите называть его коллекцией Person, продолжайте. - person Triynko; 21.04.2010
comment
@Triynko: Вы имеете в виду коллекцию Person? :) - person ErikE; 22.04.2010
comment
@Emtucifor: Да, лол. Назвать таблицу PersonCollection равносильно названию People. Сравните это с называнием такой коллекции просто Person, что не имеет смысла :) - person Triynko; 22.04.2010
comment
@Triynko: Учитывая, что таблица всем известна как набор строк, я бы никогда не назвал ее Person Collection так же, как я бы не назвал ее Person Table. Опять же, все зависит от того, как вы об этом думаете. В туалете написано «Мужчины» и «Женщины», но с таким же успехом можно сказать «Мужской» и «Женский» (а не «Мужской и женский»). Я просто хочу сказать еще раз: если бы вы увидели базу данных, полную единичных имен таблиц, таких как Person, Invoice, Address и т. Д., Вы действительно запутались бы и подумали, что у них только одна строка в каждой из них? - person ErikE; 23.04.2010
comment
@Emtucifor: Тогда давайте подумаем об этом с другой стороны, чтобы поместить соглашение об именах в контекст. Предположим, у вас есть классы объектов для представления как строки, так и таблицы. Очевидно, что Person имеет смысл для класса, представляющего строку данных. Если ваша таблица также была названа Person, то у вас может быть конфликт имен или некоторая путаница. Я просто думаю, что имеет смысл называть объекты точным множеством. Строка с данными о человеке должна называться Person, а таблица с информацией о людях или нескольких лицах - People, PersonCollection, Persons и т. Д. - person Triynko; 23.04.2010
comment
Псевдоним человека смехотворен. Не нужно вводить в заблуждение, просто назовите таблицу Человеком в первую очередь. Имя таблицы должно описывать, что такое запись \ строка в таблице. - person Josh M.; 12.11.2010
comment
@Josh M. Мне любопытно - как вы называете переменные коллекции в коде? Если у вас есть множество людей, вы называете переменную человеком? - person Matt Hamilton; 12.11.2010
comment
Конечно, это будет что-то во множественном числе, например, People. Но это не значит, что имя таблицы должно быть. Используйте пример SQL в этом ответе в качестве доказательства. Выполнение SELECT People.Name очень странно. - person Josh M.; 12.11.2010
comment
@ Джош М. Мнения разнятся. SELECT People.Name выглядит неправильно, но имя группы людей (а это все, что есть в таблице) Person также выглядит неправильно. - person Matt Hamilton; 12.11.2010
comment
Ага. В любом случае кажется, что это наполовину неправильно. - person Josh M.; 12.11.2010
comment
@Josh M. Ну, вы не тоже. Если вы пойдете моим путем, вы можете присвоить таблице People псевдоним person и указать SELECT person.Name. Проблема решена. ;-) - person Matt Hamilton; 12.11.2010
comment
Я думаю, что ваш ответ прекрасно демонстрирует одну из основных проблем, связанных с именами таблиц во множественном числе: поэтому я бы назвал таблицу сущностей Person людьми (или людьми, как вам нравится). С именами таблиц во множественном числе вы вводите дополнительную двусмысленность. Это люди или люди? Это "s" или "es"? Некоторые люди не всегда так хорошо знают, что именно. Вы же не хотите, чтобы все называли таблицы по своему усмотрению. Одиночные имена избегают двусмысленности и создают согласованность в вашем коде между именами таблиц, ключами таблиц и именами классов, что позволяет вам свободно определять имя одного из другого. - person dallin; 09.09.2015
comment
Я должен вернуться, чтобы сказать, что точное совпадение имен таблиц с именами классов кода - это большая победа. - person ErikE; 25.07.2017
comment
На самом деле выберите _1 _._ 2_ из Person, как правило, не выбирает одно имя. Он выберет все имена всех людей. Здесь мы говорим о парадигме программирования и реляционной парадигме. - person theking2; 16.04.2019
comment
Мэтт, то, что ты говоришь, тоже не совсем понятно. Таблица базы данных - это не коллекция, а нечто большее, чем класс. И чтобы понять смысл оператора sql по сравнению с простым английским языком, не сработает, идея заключается в том, что у нас есть тип объекта с именем person. А вот и запись объектов этого типа. Итак, таблица - это не что иное, как тип, и она должна оставаться единичной. Итак, чтобы было понятнее, SELECT Type.Name FROM Type where ... Это означает, что вы выбираете Name, которое является атрибутом Type из Type. - person Mosia Thabo; 07.08.2019

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

  1. Любой стандарт именования лучше, чем никакой.
  2. Не существует «единого истинного» стандарта, у всех есть свои предпочтения
  3. Если уже есть стандарт, используйте его. Не создавайте еще один стандарт или замутняйте существующие стандарты.

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

Для полей мы ожидаем, что имена полей будут включать префикс / акрион таблицы (например, cust_address1), и мы также предпочитаем использовать стандартный набор суффиксов (_id для PK, _cd для "кода", _nm для "name ", _nb для" числа ", _dt для" Дата ").

Имя поля ключа Foriegn должно быть таким же, как поле первичного ключа.

i.e.

SELECT cust_nm, cust_add1, booking_dt
FROM reg_customer
INNER JOIN reg_booking
ON reg_customer.cust_id = reg_booking.cust_id

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

person Guy    schedule 11.08.2008
comment
Специально для номера 3 у нас была группа людей, которых наняли из одной компании, и они пытались навязать свой старый стандарт именования (который никто из нас не использовал) во всем, что они делали. Очень назойливый. - person HLGEM; 22.01.2010
comment
Безусловно, делает SQL нечитаемым; но я думаю, что могу перевести. cust_nm должно быть CustomerName, booking_dt должно быть BookingDate. reg_customer, я понятия не имею, что это такое. - person Ian Boyd; 23.01.2010
comment
@ Ян. Намерение состоит в том, чтобы вы придерживались привычной системы именования и сохраняли ее согласованность. Я ВСЕГДА знаю, что любое поле даты - это _dt, любое поле имени - это _nm. reg - это пример системы регистрации (бронирования, клиенты и т. д.), и все связанные таблицы будут иметь один и тот же префикс. Но каждому свое ... - person Guy; 25.01.2010
comment
Я согласен с тем, что конкретный стандарт не так важен, как наличие последовательного стандарта. Но некоторые стандарты ошибочны. DB2 и имена столбцов, такие как CSPTCN, CSPTLN, CSPTMN, CSDLN. Люди должны узнать, что длинные имена были изобретены - мы можем позволить себе сделать вещи удобочитаемыми. - person Ian Boyd; 26.01.2010
comment
На протяжении многих лет я добавлял новые столбцы в конце своих таблиц в приложении, которое я разработал и продвигал. Иногда я использую английские имена в своих столбцах, иногда я использую испанский язык, а иногда я повторно использую столбцы для чего-то еще, вместо того, чтобы удалять их и добавлять новый столбец с надлежащим описательным именем для того, что он используется. Я намеренно сделал это, чтобы ЗАМЕТАТЬ мой исходный код на случай, если кто-то другой попытается взломать или перепроектировать мой код. Только я могу это понять, кто-то другой расстроится! .. Таким образом, им всегда во всем приходится на меня рассчитывать! - person Frank R.; 11.11.2010

  1. Нет. Таблица должна быть названа в честь сущности, которую она представляет. Человек, а не люди - вот как вы бы отнеслись к тому, кого представляет одна из записей.
  2. Опять то же самое. Столбец FirstName действительно не следует называть FirstNames. Все зависит от того, что вы хотите изобразить с помощью столбца.
  3. NO.
  4. да. Дело для ясности. Если вам нужны столбцы, такие как «FirstName», используйте регистр для облегчения чтения.

В порядке. Это мои 0,02 доллара

person Lars Mæhlum    schedule 11.08.2008
comment
Добавляем некоторую ясность к цифре 3 - префиксы - это способ встраивания метаданных в имя столбца. Нет необходимости делать это в любой современной БД по тем же причинам, что и (чрезмерное использование) венгерской нотации. - person Mark McDonald; 04.01.2010
comment
«выбрать 15 лучших из заказов» или «выбрать 15 лучших из заказов»? Последнее - мое (человеческое) предпочтение. - person Ian Boyd; 23.01.2010
comment
@ Ян Бойд: Вы действительно пишете SQL вручную? ;) - person Lars Mæhlum; 27.01.2010
comment
@Lars: я точно не использую ORM - person Ian Boyd; 27.01.2010
comment
@Lars Mæhlum: Я пишу ВЕСЬ свой SQL вручную. Держу пари, что я делаю это быстрее, чем кто-то, использующий графический интерфейс. Хотя ... возможно, вы были саркастичны? - person ErikE; 29.01.2010
comment
@Ian Boyd: Ага: ВЫБЕРИТЕ ТОП 100 * ИЗ отчета R ВНУТРЕННИЙ ПРИСОЕДИНЯЙТЕСЬ к VisitReport VR ON R.ReportID = VR.ReportID. Все зависит от того, как вы об этом думаете. Если вы поместите изображение лимона на канистру, вы узнаете, что внутри были лимоны, и вам не нужны два лимона снаружи, чтобы указать, что это может быть множественное число. Конечно, вы можете обозначить это написанным словом «лимоны». Но с таким же успехом это может быть лимон. Чтобы получить ресурс под названием лимон, перейдите сюда. - person ErikE; 29.01.2010
comment
добавьте 0,01 доллара за использование верхнего регистра в именах столбцов и добавьте еще 0,01 доллара за использование подчеркивания в именах столбцов, чтобы было легче различать имена столбцов на виду. Итого = Мое пожертвование в размере 0,02 доллара США! - person Frank R.; 11.11.2010
comment
Таблица должна быть названа в честь сущности, которую она представляет. Таблица - это набор сущностей. Хотя таблица также является сущностью, это сущность типа Table, которую бессмысленно добавлять к ее имени. - person Trisped; 09.04.2012
comment
@MarkMcDonald В системе нет необходимости, но она может быть удобочитаема. Гигантскому оператору SQL может быть очень трудно следовать. Пока префикс столбца связан с типом объекта, я не вижу вреда, но оставляю за собой право изменить. - person johnny; 15.01.2018

Я также поддерживаю соглашение об именах в стиле ISO / IEC 11179, отмечая, что они являются рекомендациями, а не предписаниями.

См. название элемента данных в Википедии:

«Таблицы являются коллекциями сущностей и следуют правилам именования коллекций. В идеале используется собирательное имя: например, Персонал. Множественное число также правильно: Сотрудники. Неправильные имена включают: Сотрудник, tblEmployee и EmployeeTable».

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

person onedaywhen    schedule 23.10.2008
comment
-1: указанный текст не имеет ничего общего с ISO / IEC 11179. Указанной странице википедии нельзя доверять; вместо этого прочтите действующий стандарт (metadata-standards.org/11179/#A5) - person mkadunc; 29.06.2012
comment
@onedaywhen: я недостаточно разбираюсь в теме, чтобы исправить страницу в Википедии; Кроме того, страница википедии не столько ошибочна, сколько вводит в заблуждение - она ​​явно не говорит о том, что ISO / IEC 11179 включает соглашения об именах баз данных, а просто говорит, что ISO / IEC 11179 применим при именовании таблиц и столбцов в реляционной базе данных. база данных. Затем приводится пример соглашения об именах, которое может использоваться для реляционной базы данных. Это позволяет вам думать, что пример взят из стандарта, хотя на самом деле это что-то придуманное автором статьи в Википедии. - person mkadunc; 03.07.2012

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

  1. Это позволяет избежать ошибок и ошибок, вызванных неоднозначностью множественного числа. Программисты не совсем известны своим знанием орфографии, и использование множественного числа некоторых слов сбивает с толку. Например, слово во множественном числе оканчивается на «es» или просто на «s»? Это люди или люди? Когда вы работаете над проектом с большой командой, это может стать проблемой. Например, случай, когда член команды использует неправильный метод для определения множественного числа в создаваемой им таблице. К тому времени, когда я взаимодействую с этой таблицей, она используется повсюду в коде, к которому у меня нет доступа или на исправление у меня уйдет слишком много времени. В результате мне приходится не забывать писать в таблице неправильно каждый раз, когда я ее использую. Что-то очень похожее произошло со мной. Чем проще вы сможете сделать так, чтобы каждый член команды мог последовательно и легко использовать точные и правильные имена таблиц без ошибок или необходимости постоянно искать имена таблиц, тем лучше. С единственной версией намного проще работать в командной среде.

  2. Если вы используете единственную версию имени таблицы И префикс первичного ключа с именем таблицы, теперь вы можете легко определить имя таблицы по первичному ключу или наоборот, используя только код. Вам может быть предоставлена ​​переменная с именем таблицы в ней, объединить «Id» в конец, и теперь у вас есть первичный ключ таблицы через код без необходимости выполнять дополнительный запрос. Или вы можете отрезать «Id» от конца первичного ключа, чтобы определить имя таблицы с помощью кода. Если вы используете «id» без имени таблицы для первичного ключа, то вы не можете с помощью кода определить имя таблицы по первичному ключу. Кроме того, большинство людей, которые используют множественное число в именах таблиц и префикс столбцов PK с именем таблицы, используют единственную версию имени таблицы в PK (например, статусы и status_id), что делает это вообще невозможным.

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

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

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

person dallin    schedule 29.04.2013

наши предпочтения:

  1. Следует ли использовать имена таблиц во множественном числе?
    Никогда. Аргументы в пользу того, что это коллекция, имеют смысл, но вы никогда не знаете, что таблица будет содержать (0,1 или много элементов). Правила множественного числа делают наименования излишне сложным. 1 дом, 2 дома, мышь против мышей, человек против людей, и мы даже не смотрели на какие-либо другие языки.

    Update person set property = 'value' действует на каждого человека в таблице.
    Select * from person where person.name = 'Greg' возвращает коллекцию / набор строк со строками людей.

  2. Должны ли имена столбцов быть единственными?
    Обычно да, кроме случаев, когда вы нарушаете правила нормализации.

  3. Должен ли я префикс таблицы или столбца?
    В основном предпочтение платформы. Мы предпочитаем добавлять столбцы к имени таблицы. Мы не префиксные таблицы, но мы делаем префиксные представления (v_) и хранимые_процедуры (sp_ или f_ (функция)). Это помогает людям, которые хотят попробовать обновить v_person.age, который на самом деле является вычисляемым полем в представлении (которое в любом случае не может быть обновлено).

    Это также отличный способ избежать столкновения ключевых слов (delivery.from прерывается, а delivery_from - нет).

    Это делает код более подробным, но часто улучшает читаемость.

    bob = new person()
    bob.person_name = 'Bob'
    bob.person_dob = '1958-12-21'
    ... очень удобочитаем и понятен. Однако это может выйти из-под контроля:

    customer.customer_customer_type_id

    указывает связь между клиентом и таблицей customer_type, указывает первичный ключ в таблице customer_type (customer_type_id), и если вы когда-нибудь увидите «customer_customer_type_id» во время отладки запроса, вы сразу узнаете, откуда он (таблица клиентов).

    или если у вас есть отношения M-M между customer_type и customer_category (только определенные типы доступны для определенных категорий)

    customer_category_customer_type_id

    ... немного (!) длиннее.

  4. Следует ли использовать регистр при именовании предметов? Да - нижний регистр :), с подчеркиванием. Они очень удобочитаемы и кроссплатформенны. Вместе с 3 выше это тоже имеет смысл.

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

person Albert    schedule 26.03.2010
comment
SELECT * FROM people AS person WHERE person.name = 'Greg' звучит для меня наиболее естественно. - person Kenmore; 28.12.2016
comment
@Zuko В основном, соглашение об именах для первичного ключа таблицы - <table name><id>, например PersonID или Person_ID и т. Д. Следовательно, имеет больше смысла, чтобы вы НЕ называли свои таблицы во множественном числе, поскольку каждая запись является отдельным человеком, а не людьми. - person Mr. Blond; 03.04.2018
comment
Никогда не знаешь, что будет в таблице (0,1 или много элементов), так зачем же единственное, если никогда не знаешь? в 99% случаев таблицы будут содержать более 1 строки, в противном случае вы можете подумать о перепроектировании своей системы. - person Mehdi Dehghani; 01.08.2020


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

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

Например. Учитывая таблицы «клиент» и «адрес», перейдем к префиксам «cust» и «addr» соответственно. "customer" будет содержать "cust_id", "cust_name" и т. д. "адрес" будет содержать "addr_id", "addr_cust_id" (FK обратно клиенту), "addr_street" и т. д.

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

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

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

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

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

SELECT cust_id, cust_name, addr_street, addr_city, addr_state
    FROM customer
        INNER JOIN address ON addr_cust_id = cust_id
    WHERE cust_name LIKE 'J%';
person Granger    schedule 02.09.2011
comment
Тогда вы больше не можете _1 _... Разве не в этом суть? - person raveren; 04.03.2013
comment
@Raveren - Ты все еще можешь. Если все, что вы делаете, это SELECT *, то запрос для этой цели не имеет значения. Когда / если позже вы будете использовать результаты этого запроса, вам нужно будет использовать имя столбца, чтобы что-то сделать с его данными, так что это то место, о котором вам нужно беспокоиться в вашем коде, а не оператор SQL. - person Granger; 26.04.2013
comment
Мне будет любопытно, в каких ситуациях требуется SELECT *? Я, конечно, не хотел бы, чтобы кто-то использовал это в производственном коде. Да, это полезно для специальных запросов и для определения того, какая часть данных делает результаты вашего множественного запроса на соединение странными, но я не могу придумать места в производственном коде, где это требуется. - person HLGEM; 30.04.2013
comment
@HLGEM - Конечно, ничего этого не требует. Но если у вас есть один запрос для извлечения данных, но несколько мест, которые будут запускать этот запрос для использования своих данных, это может быть проще для задач обслуживания. Затем, поскольку различным потребителям требуется больше или меньше столбцов, вам нужно обновить только потребителя, но не производителя. - person Granger; 02.05.2013
comment
Именно поэтому для таблиц существуют ALIAS. - person renanleandrof; 27.08.2014
comment
Если вы не кодируете все свое приложение на языке, отличном от объектно-ориентированного программирования, то наличие достойного уровня ORM делает этот аргумент излишним. - person Adam; 15.04.2015
comment
@ Адам - ​​Избыточный? Вы продолжаете использовать это слово ... И даже без этого слова ваш комментарий все равно не имеет смысла. Хорошие уровни ORM / EF соответствуют соглашениям об именах баз данных, поэтому возможность выполнять поиск по тупому тексту продолжает применяться. Кроме того, любое нетривиальное приложение в конечном итоге должно будет обойти уровень ORM / EF / LINQ. Процедурное программирование не всегда хорошо согласуется с реляционным; это другой образ мышления. - person Granger; 15.04.2015
comment
@Granger извини, может быть, я стал вспыльчивым после того, как прочитал все громкие мнения здесь. Я здесь, чтобы найти соглашение об именах базы данных для нашего приложения, которое имеет небольшую устаревшую базу данных, использующую непоследовательные префиксы столбцов. Сначала меня убедили ваши аргументы, но затем, подумав о проведенном рефакторинге и о хлопотах, связанных с попытками отслеживать использование элементов данных через приложение, я решил, что на самом деле нет, это не так полезно - SQL проникает только примерно на 20% в код, и ложные срабатывания, которые мы могли бы получить от других аналогичных имен столбцов, не были бы такой большой проблемой. - person Adam; 16.04.2015
comment
Поэтому из-за этого ответа я решил попробовать использовать префиксы таблиц в большом проекте и подумал, что доложу. Это действительно упростило рефакторинг таблиц, и это было здорово! Однако это была большая боль, чем я ожидал. В нашей базе данных было много таблиц со сложными именами. Легко запомнить, что Cust - это префикс для Customer, но не так просто запомнить префикс для HazardVerificationMethod. Каждый раз, когда я писал таблицу или поле, мне приходилось делать паузу, чтобы подумать о префиксе. В конце концов я решил, что скорость и удобство важнее, чем возможность поиска, но я действительно чувствовал, что это ценный опыт. - person dallin; 13.03.2018

Мое мнение по этому поводу:

1) Нет, имена таблиц должны быть в единственном числе.

Хотя кажется, что это имеет смысл для простого выбора (select * from Orders), он не имеет смысла для эквивалента OO (Orders x = new Orders).

Таблица в БД на самом деле является набором этой сущности, это имеет больше смысла, если вы используете set-logic:

select Orders.*
from Orders inner join Products
    on Orders.Key = Products.Key

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

Я не уверен, что всегда использование псевдонима (как предлагает Мэтт) проясняет это.

2) Они должны быть особенными, так как обладают только 1 свойством

3) Никогда, если имя столбца неоднозначно (как указано выше, когда у них обоих есть столбец с именем [Key]), имя таблицы (или ее псевдоним) может различить их достаточно хорошо. Вы хотите, чтобы запросы были быстрыми и простыми - префиксы добавляют ненужную сложность.

4) Что бы вы ни хотели, я предлагаю CapitalCase

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

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

person Keith    schedule 11.08.2008
comment
Что, черт возьми, такое CapitalCase? - person ViRuSTriNiTy; 23.06.2016
comment
@ViRuSTriNiT Возможно, он имел в виду pascal case - person marctrem; 28.02.2017
comment
Кейт, под номером 3 я делаю и то, и другое, и я непоследователен (но я отвлекся), но я не понимаю, почему плохо иметь описательное имя столбца, если оно не выходит за рамки, то же самое с таблицей, переменная и др. - person johnny; 15.01.2018
comment
@johnny это неплохо, как таковое, просто не нужно. Зачем печатать то, что вам не нужно? Также большинство intellisense в основном использует начало имени, поэтому, если у вас есть Product.ProductName, Product.ProductID, Product.ProductPrice и т. Д., Набрав Product.P, вы получите все поля с префиксом. - person Keith; 16.01.2018

На мой взгляд:

  1. Имена таблиц должны быть во множественном числе.
  2. Имена столбцов должны быть в единственном числе.
  3. No.
  4. Либо CamelCase (я предпочитаю), либо underscore_separated как для имен таблиц, так и для имен столбцов.

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

person Thomas Owens    schedule 11.08.2008
comment
относительно # 4, PascalCase ... camelCase ... snake_case ... - person Andrew; 17.12.2019

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

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

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

На всякий случай вот мои ответы:

  1. да. Таблица - это группа из записей, учителей или актеров, так что ... во множественном числе.
  2. да.
  3. Я ими не пользуюсь.
  4. База данных, которую я использую чаще всего - Firebird - хранит все в верхнем регистре, поэтому это не имеет значения. В любом случае, когда я программирую, я пишу имена так, чтобы их было легче читать, например, releaseYear.
person Mario Marinato    schedule 11.08.2008

  1. Definitely keep table names singular, person not people
    1. Same here
    2. Нет. Я видел несколько ужасных префиксов, доходящих до того, что я имел дело с таблицей (tbl_) или процедурой сохранения пользователя (usp_). Затем следует имя базы данных ... Не делайте этого!
    3. да. Я стараюсь использовать PascalCase для всех имен своих таблиц
person Bell    schedule 11.08.2008
comment
МОЙ БОГ. НЕТ. Имена таблиц ОПРЕДЕЛЕННО множественное число. Это КОЛЛЕКЦИЯ. В нем есть несколько вещей. выберите * из ЛЮДЕЙ. Вы выбираете не из одного человека, вы выбираете из нескольких ЛЮДЕЙ! - person Triynko; 01.04.2010
comment
Мне всегда нравилось, что оператор select лучше звучит во множественном числе. SELECT id,name FROM contacts WHERE email_address LIKE '%gmail%' таблицы во множественном числе, столбцы в единственном числе. Опять же всегда вопрос личного мнения. - person scunliffe; 01.07.2012
comment
префиксы tbl, qry и т. д. могут быть чрезвычайно полезны при работе с метаданными базы данных. Если вы исследуете объект в базе данных, имеющий быстрое и простое соглашение об именах, может значительно ускорить понимание - person Cruachan; 19.05.2020

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

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

Вот мои ответы:

  1. Да, имена таблиц должны быть во множественном числе, если они относятся, например, к набору сделок, ценных бумаг или контрагентов.
  2. да.
  3. да. Таблицы SQL имеют префикс tb_, представления имеют префикс vw_, хранимые процедуры имеют префикс usp_, а триггеры имеют префикс tg_, за которым следует имя базы данных.
  4. Имя столбца должно быть в нижнем регистре и разделено подчеркиванием.

Именование сложно, но в каждой организации есть кто-то, кто может называть вещи, и в каждой команде разработчиков программного обеспечения должен быть кто-то, кто берет на себя ответственность за стандарты именования и обеспечивает решение таких проблем, как sec_id, sec_value и security_id решаются раньше, чем они будут включены в проект.

Итак, каковы основные принципы хорошего соглашения и стандартов именования:

  • Используйте язык вашего клиента и область вашего решения
  • Будьте описательны
  • Быть последовательным
  • Устранение неоднозначности, отражение и рефакторинг
  • Не используйте сокращения, если они не понятны всем.
  • Не используйте зарезервированные ключевые слова SQL в качестве имен столбцов.
person winsql    schedule 11.08.2008
comment
таблицы по определению являются отношениями. которые на самом деле являются единственными. приставки отстой. Вам когда-нибудь приходилось преобразовывать таблицу в представление или наоборот? попробуйте это с префиксами. какая разница, представление это или таблица? - person William Jones; 07.04.2017
comment
Префикс может помочь там, где у нас есть одно и то же имя для двух объектов - например, функции и хранимой процедуры. У меня была бы функция с именем GetApproverList и с тем же именем, я хотел бы создать хранимую процедуру, которая будет вызывать эту функцию изнутри. Sql не позволит создавать два объекта с одинаковым именем. - person Ravinder Singh; 06.07.2019

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

http://justinsomnia.org/writings/naming_conventions.html

person Chris    schedule 22.10.2008

Имена таблиц всегда должны быть в единственном числе, потому что они представляют собой набор объектов. Когда вы говорите стадо для обозначения группы овец, или стадо для обозначения группы птиц. Во множественном числе нет необходимости. Когда имя таблицы представляет собой композицию двух имен и соглашение об именах используется во множественном числе, становится трудно понять, должно ли имя во множественном числе быть первым словом или вторым словом или обоими. Это логика - Object.instance, а не objects.instance. Или TableName.column, а не TableNames.column (s). Microsoft SQL не чувствителен к регистру, имена таблиц легче читать, если используются прописные буквы, для разделения имен таблиц или столбцов, когда они состоят из двух или более имен.

person Annie    schedule 25.06.2012
comment
Стадо - это группа овец. User - это не группа пользователей. - person EricRobertBrewer; 14.07.2017

Имя таблицы: оно должно быть в единственном числе, поскольку это единичный объект, представляющий объект реального мира, а не объекты, как в единственном числе.

Имя столбца: оно должно быть единственным числом только тогда, когда оно означает, что оно будет иметь атомарное значение, и подтвердит теорию нормализации. Однако, если имеется n свойств одного типа, они должны иметь суффикс 1, 2, ..., n и т. Д.

Приставка таблиц / столбцов: это огромная тема, о которой мы поговорим позже.

Корпус: это должен быть чехол Camel

Мой друг, Патрик Карчер, я прошу вас не писать ничего, что может быть оскорбительным для кого-то, как вы написали: «• Кроме того, внешние ключи должны быть последовательно названы в разных таблицах. Это должно быть законным. избить того, кто этого не делает ». Я никогда не совершал этой ошибки, мой друг Патрик, но я пишу в основном. Что, если они вместе планируют побить вас за это? :)

person vishesh marwah    schedule 24.09.2011
comment
Так вы говорите, что таблица - это сущность? Или это строка в таблице? Для меня таблица - это набор строк, следовательно, набор сущностей, подразумевающий множественное число. - person Jason; 10.04.2012

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

Кажется, есть два основных аргумента в пользу использования стандарта именования table_column (или tableColumn) для столбцов, оба основаны на том факте, что само имя столбца будет уникальным для всей вашей базы данных:

1) Вам не нужно постоянно указывать имена таблиц и / или псевдонимы столбцов в ваших запросах.

2) Вы можете легко найти весь код по названию столбца.

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

Всегда используйте имя таблицы в своем SQL. Например, всегда используйте table.column вместо column.

Очевидно, это решает 2), поскольку теперь вы можете просто искать table.column вместо table_column.

Но я слышу твой крик, как это решить 1)? Речь шла именно о том, чтобы этого избежать. Да, это было так, но решение было ужасно ошибочным. Почему? Что ж, решение с префиксом сводится к следующему:
Чтобы избежать необходимости указывать table.column, когда есть двусмысленность, вы называете все свои столбцы table_column!
Но это означает, что с этого момента вам ВСЕГДА придется писать имя столбца каждый раз вы указываете столбец. Но если вам все равно придется это делать, в чем преимущество постоянного явного написания table.column? Собственно, пользы нет, нужно набирать ровно столько же символов.

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

person janb    schedule 03.12.2012
comment
Как вы упомянули, вы не можете полагаться на каждый случай, имеющий table.column. Программисты все забудут в одном месте, и тогда ваш глобальный поиск и замена просто сломает всю вашу программу. Или вы сделаете это правилом, и кто-то подумает, что он выполняет правило, используя псевдоним таблицы, тем самым снова сорвав глобальную находку. Кроме того, если вы хотите организовать свой код, имея какой-то класс базы данных (что будет у любого хорошего программиста), будут моменты, когда вы просто передадите имя столбца в функцию db или просто сохраните имя столбца в Переменная. - person dallin; 29.04.2013
comment
@janb: Я полностью поддерживаю ваш ответ. Я также хочу добавить, что использование текстового поиска для поиска зависимостей - варварский способ навигации по коду. Как только люди избавятся от этой варварской практики поиска, они начнут использовать хорошее именование, которым является table.column. Так что проблема не в стиле именования, а в плохих инструментах, созданных для варваров. - person alpav; 17.02.2015
comment
Ваш аргумент ошибочен. Проблема в том, что он работает в обе стороны и не дает никаких преимуществ. Вы говорите, что для решения этой проблемы просто всегда пишите table.column, поскольку вы уже пишете table_column. Ну, вы также можете сказать, что просто напишите table_column, потому что вы уже пишете table.column. Другими словами, между вашим ответом нет никакой разницы, кроме того, что он вводит возможные ошибки и не обеспечивает соблюдение соглашений. Это причина того, что у нас есть «частное» ключевое слово. Мы могли бы доверять программистам в том, что они всегда будут правильно использовать переменные класса, но ключевое слово обеспечивает это и устраняет возможные ошибки. - person dallin; 09.09.2015

Основные правила именования баз данных (и стиль) (щелкните здесь для более подробного описания)

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

person AZ_    schedule 05.05.2011
comment
хотя то, что Oracle предлагает, это совершенно противоположно ссылаться на ссылку выше. найдите здесь то, что говорит Oracle. ss64.com/ora/syntax-naming.html - person AZ_; 05.05.2011
comment
Соглашение об именах Oracle было самым забавным из всех ... e.g. PATIENTS would have a primary key called pa_patient_id_pk !! - person nawfal; 26.01.2013

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

person paul444    schedule 26.06.2011


--Example SQL

CREATE TABLE D001_Students
(
    StudentID INTEGER CONSTRAINT nnD001_STID NOT NULL,
    ChristianName NVARCHAR(255) CONSTRAINT nnD001_CHNA NOT NULL,
    Surname NVARCHAR(255) CONSTRAINT nnD001_SURN NOT NULL,
    CONSTRAINT pkD001 PRIMARY KEY(StudentID)
);

CREATE INDEX idxD001_STID on D001_Students;

CREATE TABLE D002_Classes
(
    ClassID INTEGER CONSTRAINT nnD002_CLID NOT NULL,
    StudentID INTEGER CONSTRAINT nnD002_STID NOT NULL,
    ClassName NVARCHAR(255) CONSTRAINT nnD002_CLNA NOT NULL,
    CONSTRAINT pkD001 PRIMARY KEY(ClassID, StudentID),
    CONSTRAINT fkD001_STID FOREIGN KEY(StudentID) 
        REFERENCES D001_Students(StudentID)
);

CREATE INDEX idxD002_CLID on D002_Classes;

CREATE VIEW V001_StudentClasses
(
    SELECT
        D001.ChristianName,
        D001.Surname,
        D002.ClassName
    FROM
        D001_Students D001
            INNER JOIN
        D002_Classes D002
            ON
        D001.StudentID = D002.StudentID
);

Это условности, которым меня научили, но вы должны адаптироваться к тому, что вы используете.

  1. Множественное число. Это набор сущностей.
  2. да. Атрибут - это представление особого свойства объекта.
  3. Да, имя таблицы префиксов позволяет легко отслеживать именование всех индексов ограничений и псевдонимов таблиц.
  4. Паскаль Регистр для имен таблиц и столбцов, префикс + ВСЕ заглавные буквы для индексов и ограничений.
person Lord Future    schedule 11.08.2008
comment
ChristianName ... это странное соглашение. - person BobbyShaftoe; 25.02.2009
comment
Серийные номера у вас на столах? Кто-нибудь серьезно думает, что это имеет смысл работает для разработчиков? - person ErikE; 21.06.2011
comment
Поскольку этот пример вызвал это ... Я лично против использования аббревиатур в верхнем регистре в именах таблиц или столбцов, так как я думаю, что это затрудняет их чтение. Поэтому в этом случае я бы сказал, что StudentId предпочтительнее StudentID. Ничего страшного, когда аббревиатура стоит в конце, но в своей работе я видел бесчисленное количество примеров, когда аббревиатуры стояли в начале или в середине названия, и это затрудняло анализ в уме. Пример: StudentABCSSN vs StudentAbcSsn. - person redOctober13; 05.01.2019

person    schedule
comment
Обратите внимание на используемые стандарты: таблицы содержат несколько вещей, у пользователей одно имя, ключевые слова T-SQL в верхнем регистре, определения таблиц в случае Pascal. - person Ian Boyd; 26.01.2010
comment
опечатка: Lastname должно быть LastName - person aminimalanimal; 03.06.2017
comment
Имя таблицы должно быть в единственном числе, например: Пользователь, а не Пользователи. - person AZ_; 22.01.2020
comment
И обратите внимание, как имена таблиц имеют множественное число; поскольку они содержат Users, а не User. - person Ian Boyd; 23.01.2020