Таблиця іменування дилеми: назви однини проти множини [закрито]


1466

Academia стверджує, що назви таблиць мають бути єдиною особою сутності, для якої вони зберігають атрибути.

Мені не подобається будь-який T-SQL, для якого потрібні квадратні дужки навколо імен, але я перейменував Usersтаблицю в єдине, навіки визначаючи тих, хто використовує таблицю, іноді доводиться використовувати дужки.

Моє відчуття кишки полягає в тому, що правильніше залишатися з одниною, але я відчуваю також, що дужки вказують на таке небажане, як назви стовпців із пробілами в них тощо.

Чи повинен я залишитися чи я повинен йти?


Копіювання попередніх таблиць бази даних, іменування, множини чи однини , але ця привернула більше уваги.
outis

7
Я здивований, що більше людей не кажуть: це визначається тим, що представляє один рядок. В одній базі даних у мене може бути таблиця, у якій рядки представляють один окремий віджет, а в іншому, хто має відношення один до багатьох до цієї таблиці, означає, що рядки представляють багато віджетів. Не роблячи це, втрачає виразність.
andygavin

1
Я просто хочу додати, що в усіх цих дискусіях зауважте, що таблиця жодним чином не формується і не є такою ж, як клас. Таблиця - це сукупність елементів певного типу, які можна сортувати, запитувати тощо за окремими властивостями. Клас - це рамка для опису властивостей та поведінки конкретного типу. У термінах кодування OO закриття подання до таблиці - це сукупність об'єктів. (Незалежно від того, якою ORM ви використовуєте). Це далеко не найвища відповідь google з цього приводу, тому, хоча питання закрите, сторінка все ще має значення.

1
Я хотів би скористатися загальною практикою екосистеми, в якій ви працюєте. Наприклад: У Node.js такі ORM, як Bookshelf.js або Objection.js, в основному базуються на "Knex.js". А в документації "Knex.js" ви знайдете назви таблиць у множині. Тож я б пішов на множину в цьому домені. Джерело: knexjs.org/#Schema-createTable
Benny Neugebauer

2
Так, я згоден. Має сенс мати таблицю користувачів і називати її "AppUser", а також має сенс мати таблицю правил, що застосовуються до певного типу користувачів, і називати її "UserRules"
Arindam

Відповіді:


243

Інші дали досить хороші відповіді, що стосується "стандартів", але я просто хотів додати це ... Чи можливо, що "Користувач" (або "Користувачі") насправді не є повним описом даних, що містяться в таблиці ? Мало того, що вам слід надто з розуму назвати таблиці імена та специфіку, але, можливо, щось подібне "Widget_Users" (де "Віджет" - це назва вашої програми чи веб-сайту) було б більш доречним.


7
Я згоден. OrgUsers, AppUsers, будь-що, чого не потрібно використовувати ключове слово.
MikeW

7
-1. Користувачі таблиці (і країни, мови) можуть використовуватись у кількох програмах одночасно.
OZ_

129
Чи не пов’язане з назвою схеми видалить всю плутанину? AppName1.Users, AppName2.Users?
Zo має

7
Я не згоден з префіксом таблиці - це, можливо, має бути схема? - але я погоджуюсь з "більш описовою назвою". Навіть чогось простого, як "AppUser", було б достатньо, не входячи в усі дискусії про простір імен.

7
Ця прийнята відповідь є більше побічним коментарем і не відповідає на питання.
Віліямі

1822

У мене було те саме питання, і прочитавши всі відповіді тут, я обов'язково залишаюся з СІНГУЛЯРНИМ, причинами:

Причина 1 (концепція). Ви можете подумати про мішок, що містить яблука типу "AppleBag", неважливо, чи містить 0, 1 або мільйон яблук, це завжди той самий мішок. Таблиці - це саме те, контейнери, назва таблиці має описувати, що він містить, а не скільки даних він містить. Крім того, поняття множини більше стосується розмовної мови (насправді для визначення наявності одного чи декількох).

Причина 2 . (Зручність). легше вийти з однинами імен, ніж із множинними. Об'єкти можуть мати неправильну множину або взагалі не множину, але завжди матимуть однину (за кількома винятками, як Новини).

  • Замовник
  • Замовлення
  • Користувач
  • Статус
  • Новини

Причина 3 . (Естетика і порядок). Спеціально для сценаріїв деталізації, це краще читається, краще вирівнюється за назвою та має більш логічний порядок (Основний перший, Детально другий):

  • 1.Заказчик
  • 2.OrderDetail

У порівнянні з:

  • 1.OrderDetails
  • 2.Власники

Причина 4 (простота). Складіть всі разом, назви таблиць, основні ключі, відносини, класи уроків ... краще знати лише одне ім’я (однина) замість двох (клас однини, таблиця множини, однина поля, однина-множина множини-деталі .. .)

  • Customer
  • Customer.CustomerID
  • CustomerAddress
  • public Class Customer {...}
  • SELECT FROM Customer WHERE CustomerID = 100

Коли ви дізнаєтесь, що маєте справу з "Клієнтом", ви можете бути впевнені, що будете використовувати одне і те ж слово для всіх потреб взаємодії з вашою базою даних.

Причина 5 . (Глобалізація). Світ стає все менше, у вас може бути команда різних національностей, не всі володіють англійською мовою як рідною мовою. Неграмовому програмісту з англійської мови було б простіше думати про "сховище", ніж про "сховища" або "статус" замість "статуси". Окремі імена можуть призвести до меншої кількості помилок, спричинених помилками друку, заощадити час, не замислюючись над тим, "чи це дитина чи діти?", А отже, підвищити продуктивність.

Причина 6 . (Чому ні?). Це навіть може заощадити час на письмовій формі, заощадити місце на диску та навіть змусити клавіатуру комп'ютера тривати довше!

  • SELECT Customer.CustomerName FROM Customer WHERE Customer.CustomerID = 100
  • SELECT Customers.CustomerName FROM Customers WHERE Customers.CustomerID = 100

Ви зберегли 3 літери, 3 байти, 3 додаткові хіти клавіатури :)

І нарешті, ви можете назвати тих, хто псується із зарезервованими іменами, як-от:

  • Користувач> LoginUser, AppUser, SystemUser, CMSUser, ...

Або використовувати сумнозвісні квадратні дужки [Користувач]


624
Б'юсь об заклад, якщо ви покладете етикетку на шухляду для шкарпеток, ви б назвали її "шкарпетки".
Кріс Уорд

73
Визначимо. Важко отримати один стандарт, який працює для всіх і для всіх, важливо те, що працює для вас. Це працює для мене, і тут я пояснив, чому, але знову ж таки, це для мене, і я вважаю це дуже зручним.
Нестор

451
Питання, що більше, Кріс, чому ви будете дотримуватись правил узгодження імен бази даних, називаючи шухляду?
Кайл Клегг

83
Ця відповідь потребує більшої похвали. У ньому обговорюється купа практичних причин, які я застосовую до того, чому я віддаю перевагу однинні назви. Чергові дискусії щодо належної мови стосовно посилань є просто філософськими і затьмарюють реальну суть. Сингуляр просто працює краще.
Джейсон

298
У мене вдома є ящик "Шкарпетка", а не ящик "Шкарпетки". Якби це база даних, я б назвав це таблицею "Sock".
jlembke

260

Якщо ви користуєтеся інструментами об'єктивного реляційного відображення або надалі, я пропоную сингулярний .

Деякі інструменти, такі як LLBLGen, можуть автоматично виправляти імена множини, як "Користувачі до користувача", не змінюючи ім'я таблиці. Чому це має значення? Тому що, коли воно відображається, ви хочете, щоб він виглядав як User.Name замість Users.Name або ще гірше з деяких моїх старих таблиць баз даних, що називають tblUsers.strName, який просто заплутаний у коді.

Моє нове правило - оцінити, як воно буде виглядати, коли воно буде перетворене на об'єкт.

я знайшов одну таблицю, яка не відповідає новому іменуванню, яке я використовую - UsersInRoles. Але завжди буде кілька винятків, і навіть у цьому випадку це добре виглядає як UsersInRoles.Username.


48
Я проголосував проти, і я скажу вам чому, тому що я не згоден. ORM за своєю суттю полягає у картографуванні. Кожен інструмент ORM, який я коли-небудь використовував, підтримує вказівку назви таблиці, яка буде використовуватися для сутності, коли вона відрізняється від імені об'єкта. Це важливо, оскільки вся причина, по якій ми посилаємось на реляційні бази даних, полягає в тому, що ми можемо легко робити спеціальні запити та звіти з різною формою, ніж наша об'єктна модель. В іншому випадку ми зараз просто використовуємо бази даних об'єктів / документів.
joshperry

25
ORM не повинен диктувати назви об'єктів, які вони відображають. Точка ORM - це абстракція об'єкта, що забезпечує цю гнучкість.
barrypicker

19
У своєму світі я намагаюсь використовувати цілі імена в усьому проекті, щоб не витрачати час на цікавість, чи є цей екземпляр s в кінці чи ні. Те, що ORM може перейменовувати та бути незалежним, не означає, що це допомагає вашим колегам-розробникам.
Іоанн Микола

2
Деякі ORM (як і багато інструментів програмування) мають поведінку за замовчуванням, яка генерує реалізацію без конфігурації ... з точки продажу PRODUCTIVITY. Таким чином, створення класу Employee, без явного відображення, за замовчуванням генерує таблицю Employee
user919426

1
@barrypicker. Назви множини не просто виглядають тупо в коду ORM. Множини виглядають погано і в SQL, особливо коли йдеться про унікальний атрибут. Хто ніколи не пише користувачів user.id від користувачів? А може ... від користувачів, які залишилися приєднатися на thingy.user_id = user.id ...?
Самуель Даніельсон

219

Я вважаю за краще використовувати іменник uninflected , який в англійській мові буває одниною.

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

Оскільки ми зазвичай робимо щось із рядками, чому б не поставити ім’я в довідковому відмінку? Якщо у нас є таблиця, до якої ми пишемо більше, ніж читаємо, чому б не поставити ім’я в давальному слові? Це таблиця з чого - то, чому б не використати генитива? Ми б цього не робили, оскільки таблиця визначається як абстрактний контейнер, який існує незалежно від його стану та використання. Звернення іменника без точної та абсолютної смислової причини - це лепет.

Використання іменника uninflected є простим, логічним, регулярним та незалежним від мови.


37
Напевно, найбільш логічний аргумент з цього приводу, який я коли-небудь бачив, і радує, що витратив цей час на латинську мову. +1 точно.

52
Ну я, очевидно, повинен поповнювати свій словниковий запас.
TJ Biddle

19
+1 Дивіться, таких варіантів відповідей Інтернет потребує більше. Бездоганні докази, що використовують багатий словник для виконання досконалої логіки.
OCDev

8
Я це візьму на замітку наступного разу, коли програмую латиною. Тим часом користувачі перейдуть до таблиці користувачів, а клієнти - до таблиці клієнтів.
Caltor

8
Переконаний - це незавершено. Цікаво побачити, що зрештою цей час популярні вибір "однини" та "множини" є і помилковими!
Стюарт

126

Яка умова вимагає, щоб таблиці мали поодинокі назви? Я завжди думав, що це множинні назви.

Користувач додається до таблиці Користувачі.

Цей сайт погоджується:
http://vyaskn.tripod.com/object_naming.htm#Tables

Цей сайт не погоджується (але я не згоден з ним):
http://justinsomnia.org/writings/naming_conventions.html


Як вже згадували інші: це лише вказівки. Виберіть конвенцію, яка працює для вас та вашої компанії / проекту, і дотримуйтесь її. Переключення між одниною та множиною, а іноді і скороченнями слів, а іноді й не набагато складніше.


46
Застосовуючи теорію множин до таблиць, будь-який екземпляр у наборі є репрезентативним набором, тому Apple - це набір Apple, це агностик щодо того, скільки яблук у наборі - це Apple з багатьма примірниками. «Мішок» яблук не стає «мішком», коли містить багато яблук.
ПрофК

89
Що робити, якщо у вас є пакетик з 5 яблуками всередині? Ви називаєте це мішком яблука? чи пакетик яблук?
Крістофер Махан

26
Я думаю, що теорія полягала б у тому, що набір має назву Яблука. Окреме яблуко все ще є "набором яблук" - хоча і набором з одним екземпляром. Кілька яблук - це також "набір яблук".
Марк Брекетт

26
@Christopher, якщо причиною сумки є вміст яблук та лише яблук, то це "яблучний мішок", незалежно від того, містить 1 яблуко, 100 яблук чи немає яблук.
Ian Mackinnon

14
@ Ian: Це тому, що таблиця є загальною, і її можна порівняти з контейнером для доставки (може містити майже все, від яблучних ящиків до ящиків мотоциклів Harley Davidson). Ви кажете: вантажний контейнер з апельсинами, а не помаранчевий вантажний контейнер. Ви кажете: вантажний контейнер з автомобільних деталей, а не вантажний контейнер для автомобілів. Якщо ви створили власну структуру даних, яка мала містити лише певний тип даних, наприклад, назви яблук, і ви назвали це "кунгабого", то у вас може виникнути яблучне кунгабоко. Я знаю, що ти думаєш, але подумай спочатку про мішечок з кульками і розумію різницю в значенні.
Крістофер Махан

79

Як щодо цього як простий приклад:

SELECT Customer.Name, Customer.Address FROM Customer WHERE Customer.Name > "def"

vs.

SELECT Customers.Name, Customers.Address FROM Customers WHERE Customers.Name > "def"

SQL в останньому звучить чужіше, ніж у першому.

Я голосую за однину .


49
У цьому прикладі, так, але в практичному sql це ніколи не було б написано таким чином. У вас з’явиться псевдонім таблиці, тому він буде більше схожийSELECT C.Name, C.Address FROM Customers WHERE Customers.Name > 'def'
Майкл Харен

+1, (через рік) Ви навели терористичний приклад того, як однина має сенс. Це дещо релігійна дискусія. Мене декілька років тому повернув сингулярний архітектор даних багато років мій старший, і мені це здалося правильним (після того, як мені потрібно було переконливо переключитись).
Кріс Адранья

24
Я думаю, що sql звучить краще множини. У вас не було б імен таблиць для кожного стовпця, чому ви так любите вводити текст. ВИБІРТЕ ім'я, адресу від клієнтів, де ім'я> "def" Ви вибираєте з пулу клієнтів, де назва більше, ніж def.
Jamiegs

6
Як щодо використання псевдоніма / AS, щоб обійти цю проблему? ВИБІРУЙТЕ Customer.Name, Customer.Adress ДО Клієнтів ЯК Клієнт, ДЕ Клієнт. Ім'я> "def"
Джеймс Х'юз

1
Другий звучить набагато краще, поодинокі звучать як хтось, хто не вміє розмовляти англійською.
HLGEM

61

Я твердо переконаний, що в діаграмі взаємозв'язків суб'єкта господарювання слід відображати сутність однини, подібно до того, що ім'я класу є єдиним. Ім'я, яке відображається, відображає його екземпляр. Отже, у базах даних сутність, коли вона складається в таблицю (колекція сутностей або записів), є множиною. Суб’єкт, Користувач перетворюється на користувачів таблиці. Я погодився б з іншими, хто запропонував, можливо, ім'я Користувача можна було б покращити до Співробітник або щось більше застосовне до вашого сценарію.

Потім це має більше сенсу в операторі SQL, оскільки ви вибираєте з групи записів, і якщо назва таблиці є сингулярним, воно не добре читається.


3
Мені особливо подобається коментар заяви SQL. Використання однини тут не відчуває інтуїтивно зрозумілого для читача.
hochl

2
Відмінний момент щодо ERD. Я підозрюю, що саме тому, хто бачить світ очима DBA, особливе називання має сенс. Я підозрюю, що вони не отримують, як ви вказуєте, різниці між сутністю та колекцією їх.
Вільям Т. Маллард

1
Таблиця - це не збірка записів; таблиця - це визначення того, як виглядає запис. Оце і є роз'єднання, яке, здається, мають усі народні множини / однини.
багатий ремер

Я не згоден з коментарем заяви SQL. Що робити , якщо ви хочете приєднатися проти Users.Id
хеш - таблицю

1
Один old_lady має багато котів АБО old_ladies мають котів. Я думаю, що ЕРД приємніше читати як множину. І в таблиці сутностей, у таблицях є багато сутностей, тому я знову думаю, що множина звучить добре.
користувач3121518

39

Я дотримуюся однини для назв таблиць та будь-якої суті програмування.

Причина? Той факт, що в англійській мові є неправильні множини, такі як миші ice миші та вівці ⇒ вівці . Потім, якщо мені потрібна колекція , я просто використовую мишей чи овець і рухаюся далі.

Це дійсно допомагає множині виділитися, і я можу легко і програмно визначити, як виглядатиме колекція речей.

Отже, моє правило таке: все є одниною, кожна колекція речей є одниною із доданим s . Допомагає і з ORM.


7
як щодо слова, що закінчується на 's'? Якщо у вас є таблиця під назвою "Новини" (лише як приклад), як би ви назвали збірник новин? Newss? Або ви б назвали таблицю "Новою"?
Ентоні

18
Я б назвав таблицю NewsItem та колекцію NewsItems.
Попільна машина

5
Що робити, якщо вам доведеться перевірити орфографію всього коду, інакше він не складеться;)?
Гаміш Грубіян

2
ORM не повинен диктувати назви об'єктів, які вони відображають. Точка ORM - це абстракція об'єкта, що забезпечує цю гнучкість.
barrypicker

16
@HamishGrubijan тоді перестаньте використовувати Word для написання свого коду! ;)
Валентино Вранкен

36

ІМХО, назви таблиць мають бути множинами, як клієнти .

Назви класів мають бути поодинокими, як Клієнт, якщо він відображає рядок у таблиці Клієнти .


33

Однини. Я не купую жодного аргументу, який стосується найбільш логічного - кожна людина вважає, що його власні переваги є найбільш логічними. Незалежно від того, що ти робиш, це безлад, просто вибери умову і дотримуйся цього. Ми намагаємось зіставити мову з сильно нерегулярною граматикою та семантикою (звичайна розмовна та письмова мова) на дуже регулярну (SQL) граматику з дуже специфічною семантикою.

Мій головний аргумент полягає в тому, що я не думаю про таблиці як про набір, а як про відносини.

Отже, AppUserспіввідношення говорить про те, які сутності AppUsers.

Співвідношення AppUserGroupпідказує мені, які сутностіAppUserGroups

AppUser_AppUserGroupСтавлення каже мені , як AppUsersі AppUserGroupsпов'язані між собою .

AppUserGroup_AppUserGroupСтавлення каже мені , як AppUserGroupsі AppUserGroupsпов'язані (тобто групи членів групи).

Іншими словами, коли я думаю про сутності та про те, як вони пов’язані між собою, я думаю про відносини в однині, але, звичайно, коли я думаю про сутності в колекціях чи наборах, колекції чи множини є множиною.

У моєму коді тоді і в схемі бази даних я використовую однину. У текстових описах я в кінцевому підсумку використовую множину для збільшення читабельності - потім використовую шрифти тощо, щоб відрізнити назву таблиці / відношення від множини s.

Мені подобається вважати це безладним, але систематичним - і таким чином завжди є систематично породжене ім’я для відносин, які я хочу висловити, що для мене дуже важливо.


1
точно. головне, що багато людей тут не усвідомлюють - це те, що вони називають ... Ви даєте ім'я відношенню (один запис у таблиці), а не набір записів у таблиці.
Олександр Мартіні

3
Не можу погодитися більше. "Виберіть * з користувачів, де Ім'я на зразок" J% "", оскільки я вибираю всіх користувачів, де ім'я починається з "J". Якщо ваш аргумент полягає в тому, що ви хочете написати "... де User.Name like ...", просто використовуйте псевдонім. З тієї ж причини я кажу: «Дайте мені пару від усіх доступних шкарпеток».
Марк А. Донохое

Якби я був саме таким, моє ім'я таблиці було б sock_pair
Мануель Ернандес

@AlexandreMartini Рівно. Як і деякі люди, які називають один запис у таблиці "відношенням".
Нуно Андре

31

Я також пішов би з множиною , і, згаданою вище дилемою Користувачів , ми застосовуємо підхід з квадратним дужкою.

Ми робимо це, щоб забезпечити рівномірність між архітектурою баз даних та архітектурою додатків, маючи на увазі розуміння того, що таблиця Користувачів - це сукупність значень Користувача стільки, скільки колекція користувачів у артефакті коду - це сукупність об’єктів Користувача .

Наявність нашої команди даних та наших розробників, які говорять однаковою концептуальною мовою (хоча не завжди однакові імена об'єктів), полегшує передачу ідей між ними.


8
Я згоден .. чому невідповідність між кодом і сховищем? Я б ніколи не називав колекцію об'єктів користувача "Користувачем" у коді ... так чому б я називав це таблицею? Це не має сенсу. Коли я читаю аргументи вище про це, вони зосереджуються на сутності, а не на таблиці ... між таблицею є різниця, ніж сама таблиця.
Джейсон

Як ви маєте справу з назвою таблиці, як, наприклад, companiesтам, де в інших таблицях називається поле посилання company_id? Незважаючи на те, що він написаний належним чином, він виглядає непослідовним для тих, хто прискіпливий до умов імен таблиць.
Джейк Вілсон

1
Пам'ятаючи, що однина companiesє company, і що цей ідентифікатор є посиланням на єдиний елемент. Це не повинно турбувати нас кодом більше, ніж нас турбує англійською.
Девід

22

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

У цей самий момент я використовую поодинокі імена для визначення моделі даних для моєї компанії, тому що більшість людей на роботі відчувають себе більш комфортно. Іноді потрібно просто полегшити життя всім, а не нав’язувати свої особисті переваги. (саме так я опинився в цій темі, щоб отримати підтвердження того, що має бути "найкращою практикою" для іменування таблиць)

Прочитавши всі суперечки в цій темі, я дійшов одного висновку:

Мені подобаються мої млинці з медом, незалежно від того, який улюблений смак у всіх. Але якщо я готую для інших людей, я постараюся подати їм те, що їм подобається.


Нерозумно використовувати таку конвенцію у світі реляційних моделей, особливо коли ви описуєте відношення між об'єктами, наприклад, "Кожна команда може мати лише одного головного тренера та багатьох другорядних тренерів", що описано: Team-> MainCoach, Team - >> SecondaryCoach
noonex

16

Однини. Я б назвав масив, що містить купу об’єктів представлення рядків користувачів "користувачами", але таблиця - "таблиця користувачів". Думати про таблицю як не що інше, як набір рядків, які вона містить, неправильно, ІМО; таблиця є метаданими, а набір рядків ієрархічно приєднаний до таблиці, це не сама таблиця.

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


Гадаю, у кожного свій. Таблиця реляційних баз даних за визначенням - це заголовок (тобто метадані, що називає атрибути) та набір кортежів, що відповідають заголовку. Ви можете зосередитись на метаданих, тоді як інші люди фокусуються на кортежах. :-)
Білл Карвін

Гей, User_Table - це ім’я, яке мені подобається! :)
Каміло Мартін

3
ORM не повинен диктувати назви об'єктів, які вони відображають. Точка ORM - це абстракція об'єкта, що забезпечує цю гнучкість.
barrypicker

1
Я дивлюся на це таким чином .. якщо ви створюєте масив / список / словник будь-чого в коді, мою ставку, ви називаєте це ім'ям множини того, що він містить. Якщо ви використовуєте ORM для абстрагування вашої бази даних, таблиці представлені якоюсь колекцією, то чому б ви ставились до них будь-якими різними? Використовувати поодинокі імена може здатися добре, але ви завжди боретеся зі своїм інстинктом, що таблиця містить багато того самого, як і колекція в коді. Чому непослідовність?
Джейсон

@Jason: Будь ласка , порівняти і зіставити, як ці речі читати: 1) $db->user->row(27), $db->product->rows->where(something) 2) $db->users->row(27), $db->products->rows->where(something).
хаос

16

Насправді я завжди вважав популярним умову використовувати множинні назви таблиць. До цього моменту я завжди використовував множину.

Я можу зрозуміти аргумент для однини назв таблиці, але для мене множина має більше сенсу. Назва таблиці зазвичай описує, що містить таблиця. У нормалізованій базі даних кожна таблиця містить конкретні набори даних. Кожен рядок є сутністю, а таблиця містить багато сутностей. Таким чином, форма множини для назви таблиці.

Таблиця автомобілів мала б назву автомобілів, і кожен ряд - це машина. Я визнаю, що конкретизувати таблицю разом із полем table.fieldє найкращою практикою, а наявність сингулярних назв таблиць є більш читабельною. Однак у наступних двох прикладах перший має більше сенсу:

SELECT * FROM cars WHERE color='blue'
SELECT * FROM car WHERE color='blue'

Чесно кажучи, я буду переосмислювати свою позицію щодо цього питання, і буду покладатися на фактичні конвенції, якими користується організація, для якої я розробляю. Однак, я думаю, що для моїх особистих умовностей я буду дотримуватися множинних назв таблиці. Для мене це має більше сенсу.


9
Чи це теж не конвенція в RoR? Множинні назви для таблиць та однини для класів ORM? Має багато сенсу для мене. Таблиця називається "автомобілі", тому що у неї є багато примірників "автомобіль", а клас називається "автомобіль", тому що він буде містити один примірник автомобіля !!
Сап

@Sap Невелика корекція останньої частини вашого речення - Клас "Автомобіль" - це абстрактний тип даних, що представляє Автомобіль реального життя. Чи буде він містити один екземпляр або кратні, залежить від способу його використання.
асгс

давайте зіткнутися з нею, таблиця car- це визначення структури одного автомобіля. Якщо ви подивитесь на структуру таблиці, вона викличе в основному "id int, кольоровий рядок тощо". Крім того, скажіть, у вас є таблиця car_vendor(або для вашої множинної версії це було б cars_vendor) із зовнішнім ключем cars_id?! що це за дурне лайно? це не car_id не потрібно , щоб змусити мене думати. Сингулярно мені дуже
подобається

4
Мені дуже подобається ця відповідь! Дозволь пояснити. Якщо колекція є, carі ви хочете, щоб все з carцього blueрезультату має бути чимось подібним tire, mirror, engine. І тоді це стає заплутаним, тому що всі результати - partsвід car. Тож назва таблиці має бути carparts(або car_parts, CarPartsщо завгодно)
arnoudhgz

Будь-який дизайнер баз даних, який застосовує поодинокі назви таблиць, в основному оголошує війну будь-яким розробникам додатків Ruby on Rails, які можуть вступити в контакт з цією базою даних у майбутньому. Суворе наполягання Рейла на однині слів для занять та множинні назви для таблиць дає можливість отримати багато потужних дій у багатьох дорогоцінних каменях всередині екосистеми Рубі. Тож навіть якщо ви думаєте, що однина звучить краще, задля сумісності вам слід дотримуватися множини. Я думаю, це справедливо і для багатьох інших об'єктивних реляційних Mappers.
Келсі Ханнан

15

Мені не подобаються назви множинних таблиць, тому що деякі іменники в англійській мові не враховуються (вода, суп, готівка) або значення змінюється, коли ви робите це підрахунком (курка проти курки; м'ясо проти птиці). Мені також не подобається використовувати абревіатури для назви таблиці чи назви стовпців, оскільки це додає додаткового нахилу до вже крутої кривої навчання.

За іронією долі, я можу зробити Userвиняток і назвати його Usersчерез USER (Transac-SQL) , тому що мені теж не подобається використовувати дужки навколо столів, якщо мені не доведеться.

Мені також подобається називати всі стовпці ідентифікаторів як Id, ні ChickenIdабо ChickensId(що з цим роблять множини хлопців?).

Все це тому, що я не маю належної поваги до систем баз даних, я просто повторно застосовую знання з однієї хитрості-поні від OO іменування таких конвенцій, як Java за звичкою та лінню. Я хотів би, щоб була краща підтримка IDE для складного SQL.


8
У нас множини хлопці або називають стовпчик 'id' id ', як ви, або' singular_id '. Я вважаю, що таблиці повинні бути множинними (думати про них як масиви), але назви стовпців мають бути єдиними (атрибути одного елемента).
вересня

plu_ral / PluRal для імен таблиць, singular_id / singularId для первинних ключів.
hochl

14

Ми застосовуємо подібні стандарти, коли в сценаріях ми вимагаємо [] навколо імен, а там, де відповідні класифікатори схеми - в першу чергу, це захищає ваші ставки від майбутніх схоплень імен синтаксисом SQL.

SELECT [Name] FROM [dbo].[Customer] WHERE [Location] = 'WA'

Це врятувало наші душі в минулому - деякі наші системи баз даних пройшли 10+ років від SQL 6.0 до SQL 2005 - набагато минувши їх запланований термін.


Схоже на ритуалістичне самобичування. Чи траплялося ще таке схоже ім’я?
Kjetil S.

13

Таблиці: множина

У таблиці користувачів вказано кілька користувачів.

Моделі: однина

З таблиці користувачів можна вибрати окремого користувача.

Контролери: множина

http://myapp.com/users перелічить декількох користувачів.

Це я все-таки беру на себе.


1
Ближче до мого сприйняття, але моє те, що зберігання таблиці декількох користувачів насправді є випадковим і що будь-який сингулярний користувач представлений таблицею, а точніше відношенням, що представляє собою набір кортежів, що представляють сутність Користувача.
ПрофК

Я думаю, що я схильний з цим погоджуватися. Єдине, що мене бентежить, - чому моделі повинні бути єдиними? Тільки якщо модель стосується лише одного Користувача. Якщо я запитував db, щоб отримати всіх користувачів, то чи потрібно мені отримати доступ до моделі? Немає сенсу для окремого екземпляра отримувати всі записи, наприклад: $ user-> get_all () // не має сенсу
PM7Temp

12

Я прихильник особливих назв таблиць, коли вони роблять мої діаграми ER за допомогою синтаксису CASE простішими для читання, але, читаючи ці відповіді, я відчуваю, що це ніколи не сприймалося дуже добре? Я особисто це люблю. Існує хороший огляд із прикладами того, наскільки читабельними можуть бути ваші моделі, коли ви використовуєте поодинокі назви таблиць, додаєте дієслова до ваших стосунків та формуєте хороші речення для кожного стосунку. Це все трохи надмірної кількості баз даних 20 таблиць, але якщо у вас є БД із сотнями таблиць і складною конструкцією, як ваші розробники коли-небудь зрозуміють це без хорошої читабельної схеми?

http://www.aisintl.com/case/method.html

Щодо префіксації таблиць і поглядів, я абсолютно ненавиджу цю практику. Не дайте людині взагалі ніякої інформації, перш ніж давати їм можливо погану інформацію. Кожен, хто переглядає db для об'єктів, може досить легко повідомити таблицю з виду, але якщо у мене є таблиця з назвою tblUsers, я чомусь вирішу переструктурувати в майбутньому дві таблиці, з метою об'єднання їх, щоб не порушити старий код Зараз у мене є вид з назвою tblUsers. На даний момент у мене залишаються два непривабливі варіанти, залиште подання, назване префіксом tbl, який може заплутати деяких розробників або змусити переписати інший шар, або середній рівень, або додаток, щоб посилатися на мою нову структуру або ім'я viewUsers. Це заперечує значну частину цінності поглядів на ІМХО.


1
Хороший приклад неполадки префіксації назв об'єктів з класифікатором 'type'!
Кенні Евітт

12

Система tables/viewsсамого сервера ( SYSCAT.TABLES, dbo.sysindexes, ALL_TABLES, information_schema.columnsі т.д.) майже завжди під множині. Я думаю, що заради послідовності я б дотримувався їхніх результатів.


Майкрософт - це те, що вони є для ділових причин першими (і часто це неетичні причини), а логічні - останніми. Моя єдина причина слідувати за ними - це те, що вони є великою горилою, і всі інші йдуть цим шляхом. Коли у мене є вибір, я вибираю інший шлях.
Брюс Патін

1
Слід зазначити, що information_schemaце частина ISO / IEC 9075-11, стандарту SQL. І так, він використовує множини таблиць / імена переглядів.
Пауло Фрейтас

10

Якщо ми подивимось на MS SQL Server'sсистемні таблиці, то їх імена, призначені Microsoft, містяться в plural.

Системні таблиці Oracle названі в singular. Хоча декілька з них є множиною. Oracle рекомендує множину для визначених користувачем імен таблиць. Це не має особливого сенсу, коли вони рекомендують одне і слідувати іншому. Те, що архітектори цих двох програмних гігантів називали свої таблиці за допомогою різних умов, не має великого сенсу ... Зрештою, що це за хлопці ... кандидат наук?

Я пам’ятаю, в академіях рекомендація була єдиною.

Наприклад, коли ми говоримо:

select OrderHeader.ID FROM OrderHeader WHERE OrderHeader.Reference = 'ABC123'

може, b / c кожен IDобраний із певного одного ряду ...?


1
Майкрософт - це те, що вони є для ділових причин першими (і часто це неетичні причини), а логічні - останніми. Моя єдина причина слідувати за ними - це те, що вони є великою горилою, і всі інші йдуть цим шляхом. Коли у мене є вибір, я вибираю інший шлях.
Брюс Патін

Дві речі. По-перше, ти зазвичай не використовуєш імена таблиць і напишеш "select ID F OrderHeaders WHERE Reference =" ABC123 ", оскільки ти" Вибір усіх ідентифікаторів з OrderHeaders, де щось відповідає дійсності ", але якщо ти повинен був використовувати імена таблиць через приєднуйтесь або будь-що, ви б використовували псевдонім, як-от так ... "виберіть OrderHeader.ID З OrderHeaders як OrderHeader, де OrderHeader.Reference = 'ABC123'
Марк А. Донохоє,

9

Це може бути трохи зайвим, але я б запропонував бути обережними. Не обов’язково, що погано перейменовувати таблиці, але стандартизація - це саме це; стандарт - ця база даних вже може бути «стандартизованою», але це погано :) - Я б запропонував узгодженість бути кращою метою, враховуючи, що ця база даних вже існує, і, імовірно, вона складається з більш ніж двох таблиць.

Якщо ви не зможете стандартизувати всю базу даних або принаймні плануєте працювати з цією метою, я підозрюю, що назви таблиць - це лише верхівка айсберга, і зосередитись на завданні, яке переносить біль від погано названих об'єктів, може бути в ваш найкращий інтерес -

Практична послідовність іноді є найкращим стандартом ... :)

my2cents ---


9

Можливі альтернативи:

  • Перейменуйте таблицю SystemUser
  • Використовуйте дужки
  • Зберігайте назви таблиці множини.

ІМО, що використовує дужки, є технічно найбезпечнішим підходом, хоча він трохи громіздкий. IMO це 6 з одного, півдесятка іншого, і ваше рішення дійсно просто зводиться до особистих / командних уподобань.


2
Мені подобається ваша «префіксальна» ідея, але я б назвав її SystemUser.
ПрофК

9

Моє взяття складається в семантиці залежно від того, як ви визначаєте контейнер. Наприклад, «мішок з яблуками» або просто «яблука» або «мішок з яблуками» або «яблуко».

Приклад: таблиця "коледж" може містити 0 або більше коледжів, таблиця "коледжів" може містити 0 або більше колег

a "student" table can contain 0 or more students 
a table of "students" can contain 0 or more students.

Мій висновок полягає в тому, що або це добре, але ви повинні визначити, як ви (або люди, що взаємодіють з ним), підходити під час посилання на таблиці; "таблиця сокири" або "таблиця xs"


8

Як вже згадували інші, конвенції повинні бути інструментом для підвищення простоти використання та читабельності. Не як кайдани чи клуб, щоб катувати розробників.

Однак, мої особисті переваги - використовувати особливі імена і для таблиць, і для стовпців. Це, ймовірно, відбувається з мого програмного тла. Назви класів, як правило, поодинокі, якщо вони не є якоюсь сукупністю. У моїй свідомості я зберігаю чи читаю окремі записи у відповідній таблиці, тому однина має для мене сенс.

Ця практика також дозволяє мені зарезервувати множинні назви таблиць для тих, хто зберігає зв'язки між багатьма об'єктами.

Я також намагаюся уникати зарезервованих слів у таблиці та назвах стовпців. У випадку, про який йдеться, має сенс суперечити єдиному умові для користувачів, щоб уникнути необхідності інкапсуляції таблиці, що використовує зарезервоване слово користувача.

Мені подобається використовувати префікси обмеженим чином (tbl для імен таблиць, sp_ для імен проц і т.д.), хоча багато хто вважає, що це додає безладу. Я також віддаю перевагу іменам CamelBack перед підкресленнями, оскільки під час введення імені завжди натискаю +, а не _. Багато інших не згодні.

Ось ще одне хороше посилання для іменування настанов щодо конвенції: http://www.xaprb.com/blog/2008/10/26/the-power-of-a-good-sql-naming-convention/

Пам’ятайте, що найважливішим фактором вашої конвенції є те, що це має сенс для людей, які взаємодіють із відповідною базою даних. Немає "Одного кільця, щоб правити всім", коли мова йде про імена конвенцій.


18
Ігнорування жахів угорської нотації. Ніколи, ніколи, ніколи не використовуйте sp_ перед збереженими процедурами, оскільки MS-SQL використовує це для системних процедур, що зберігаються, та обробляє їх спеціальними. Оскільки sp_ зберігаються в головній таблиці, MS-SQL завжди виглядає раніше, навіть якщо ви визначили місце розташування.
Буде Дієріх

8

Я думаю, що використання однини - це те, чого нас навчали в університеті. Але в той же час ви можете стверджувати, що на відміну від об'єктно-орієнтованого програмування, таблиця не є примірником її записів.

Я думаю, що наразі нахилююся до однини через множинні порушення в англійській мові. У німецькій мові це ще гірше через відсутність послідовних форм множини - іноді ви не можете зрозуміти, чи є слово множинним чи ні без вказаної статті перед ним (der / die / das). А в китайській мові все одно немає форм множини.


В університеті мене викладають множини для таблиць, у мене також є книга, третє видання з управління БД з 90-х, таблиці є однини; в той час як у мене також є оновлена ​​копія, 11e, однини та деякі скорочені імена, тоді як у розділі XML використовується множина. \ n Але якщо ви перевіряєте фактичний вміст розділів RDBMS, це буквально все одно той самий текст із деякими зображеннями, які отримали підтяжку обличчя. \ n "Контрольний список моделювання даних" нічого не визначає на множині проти однини, лише те, що об'єкти повинні відображати лише один об'єкт, це, мабуть, те, що вони намагалися застосувати у книгах.
Марко

8

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


8

Я завжди використовував однину просто тому, що саме цього мене вчили. Однак, створюючи нову схему нещодавно, вперше за довгий час, я активно вирішив підтримувати цю конвенцію просто тому, що ... вона коротша. Додавання 's' до кінця імені кожної таблиці здається мені так само марним, як додавання 'tbl_' перед кожним.


7

Я завжди думав, що це німа умова. Я використовую множинні назви таблиць.

(Я вважаю, що за цією політикою раціональним є те, що генераторам коду ORM стає легше виробляти об'єкти та колекції класів, оскільки легше створювати множинне ім’я з єдиного імені, ніж навпаки)


11
Ця конвенція була частиною реляційної теорії довго, довго, перш ніж існувала ORM.
ПрофК

1
ORM не повинен диктувати назви об'єктів, які вони відображають. Точка ORM - це абстракція об'єкта, що забезпечує цю гнучкість.
barrypicker

7

Я використовую лише іменники для моїх таблиць, які написані однаково, однини чи множини:

лось-риба літальний олень ви штани шорти окуляри ножиці види потомство


6

Я не бачив цього чітко сформульованого в жодній з попередніх відповідей. Багато програмістів не мають на увазі формального визначення під час роботи з таблицями. Ми часто спілкуємося інтуїтивно з точки зору "записів" чи "рядків". Однак, за деякими винятками для денормалізованих відносин, таблиці, як правило, розроблені таким чином, що співвідношення між не ключовими атрибутами та ключем являє собою задану теоретичну функцію.

Функція може бути визначена як підмножина перехресного добутку між двома наборами, в яких кожен елемент набору ключів зустрічається щонайбільше одного разу у відображенні. Отже, термінологія, що випливає з цієї точки зору, має тенденцію бути єдиною. Можна побачити ту саму особливу (або, принаймні, не множину) умову в інших математичних та обчислювальних теоріях, що включають функції (наприклад, алгебра та лямбда-числення).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.