Який ефективний спосіб маркування стовпців у базі даних?


30

Я використовував позначення стовпців у своїх базах даних так:

user_id
user_name
user_password_hash

Щоб уникнути конфліктів при з'єднанні двох таблиць, але потім я дізнався більше про те, як псувати псевдоніми, і перестав це робити.

Який ефективний спосіб маркування стовпців у базі даних? Чому?


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

@Joe, Ну, я завжди використовував MySQL і SQLite3, але це має стосуватися більшості інших баз даних.
Thomas O

@joe ніколи не помічав, що Oracle інший. Чи можете ви надати посилання?
bernd_k

@bernd_k: Я додав декілька посилань на свою відповідь , нижче
Joe

Відповіді:


33

У вашому випадку користувач префікса зайвий. Ми (відповідальні розробники) знаємо, що це користувач таблиці, тому навіщо додавати user_префікс перед кожним полем?

Я б вам запропонував зробити це з більш природним підходом.

Які характеристики людини: Прізвище, ім’я, дата народження, громадянство тощо ...

Які характеристики автомобіля: модель, рік, колір, енергія тощо ...

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


1
Так, це мене лютує, коли люди роблять це. Крім того, коли вони називають усі свої таблиці tbl_ незалежно від того.
Гай

Це також стосується поняття "Класні слова", і, здається, в громаді виникають певні дебати, коли Класові слова є і не підходять. (слово класу - це інструмент: Ідентифікувати окрему категорію або класифікацію даних, виділити тип даних, що описуються ім'ям даних, та описати основну класифікацію даних, пов’язаних із елементом даних.)
Джон Шонінг,

17

Окрім коментаря Spredzy, позначте свої первинні ключі однаковими (ID), щоб, коли ви пишете запити під час руху, ви могли легко згадати (u.ID = c.ID), а не шукати "Чи було це CountryID , country_ID, country_ID, countryID,? "


5
Я колись працював над базою даних, де DBA вирішив використовувати ідентифікатор в одних таблицях, а в інших - ідентифікатор, і у нас було встановлено MySQL, щоб залежно від регістру ... весело провели час!
Тобі

6
Зазвичай ми використовуємо tablename.tablename_id. Наприклад, car.car_id; person.person_id. Окремі назви таблиць.
glasnt

@glasnt розумне рішення.
garik

1
Це насправді дуже погана ідея, і ви втратите можливість використовувати USINGпункт SQL (це проти специфікації).
Еван Керролл

9

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

Немає сенсу мати користувачів.user_id та cars.car_id, коли ви могли мати користувачів.id та cars.id


7

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

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

  • Ви можете використовувати цей синтаксис об'єднання: a JOIN b USING (a_id) JOIN c USING (a_id). Дуже зручно і також допомагає наступний момент.

  • Якщо ви запускаєте запити з великою кількістю приєднань або створюєте матеріалізовані представлення SELECT *, ви ніколи (добре, можливо, рідко) не матимете конфлікту. Подумайте про приєднання person.name, product.name, country.nameі т.д. Urgh.

  • Взагалі, якщо у вас є великі запити, важко відстежувати, що idозначає всюди.


Як би ви назвали стовпець, наприклад, ім'я працівника та ім’я сайту, наприклад? Як би уникнути надмірності стовпця мітки імен?
Spredzy

@Spredzy: Я б просто пішов із надмірністю.
Пітер Ейзентраут

1
Відповідь на ці проблеми: псевдоніми.
Йон з усіх торгів

7

Подивимось, з вашим прикладом це буде виглядати приблизно так:

USERS
----
id
username,
password
registration_date

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

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


+1 для "знайдіть якийсь стиль, який вам подобається, і дотримуйтесь його". Послідовність краще, ніж точно відповідати якомусь конкретному стандарту (хоча якщо ви ще не вибрали стандарт, деякі краще, ніж інші).
Джон з усіх торгів

5

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

Нещодавно я покинув компанію, де один із розробників віддав перевагу приставці стовпців первинного ключа та стороннього ключа за допомогою pk та fk. Це призводить до деяких мерзот, коли стовпці починалися з pkfk (зазвичай це складений первинний ключ на основі 2 стовпців, з яких один стовпець був іноземним ключем до іншого таблиці).


4
чи вважається це fk_cluster?
Каджі

5

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

В ідеалі назви стовпців унікальні для всіх таблиць бази даних.

Деякі спостереження:

  • нам потрібні псевдоніми таблиць, коли таблиці об'єднуються кілька разів у операторі select
  • це запобігає деяким помилкам при копіюванні фрагментів коду, оскільки назви стовпців повинні бути адаптовані до назви таблиці
  • це допомагає показати, до якої таблиці вказується стовпчик іноземного ключа

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


3

Я погоджуюся з відповіддю Spredzy, але додав би, що в якості переваги я використовую camelCase замість under_score.

firstName, lastName тощо.


2
-1 тому, що CamelCase працює не у всіх системах баз даних і ви не вказали систему баз даних. Наприклад, погана новина про використання CamelCase в Oracle (для її створення знадобиться використання подвійних лапок, але з тих пір кожен, хто має до неї доступ, повинен буде переходити через обручі, щоб отримати доступ / використовувати його). Який кошмар.
ScottCher

@ScottCher - Я не знав, що це не працює в Oracle, але тоді я не OBA DBA. Я б подумав, що це буде сприйнято як врахування, що назви стовпців спочатку повинні відповідати правилам, викладеним у відповідному DBS.
Тобі

3

У разі Oracle, ви хочете , щоб НЕ назвати стовпці «ідентифікатор» або «ім'я» або що - небудь родове.

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

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

SELECT
  instrument.name as instrument_name,
  instrument.abbr as instrument_abbr,
  source.name     as source_name,
  source.abbr     as source_abbr,
  ...
FROM ...

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

... і збереження набору тексту приводить нас до ще однієї проблеми в Oracle - принаймні до 8i (поточна версія, коли я брав курси настройки Oracle SQL Tuning та моделювання даних) кешування планів виконання засноване на перших стільки символах запит (не можете згадати точне значення ... 1024?), тож якщо у вас є запити, які змінюються лише чим-небудь до кінця пункту де, і дійсно довгий список стовпців, які ви виймаєте, ви може зіткнутися з хітом продуктивності, оскільки він не може правильно кешувати план виконання.

У Oracle було керівництво по вибору того, що вони стверджують, що це гарні назви таблиць і стовпців, що в основному є посібником для видалення букв, поки це приблизно 5-8 символів, але я ніколи не дуже переймався цим.

...

Як інакше:

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

оновлення : для тих, хто не знайомий з поведінкою приєднання Oracle, перегляньте останній приклад з Mastering Oracle SQL: Умови приєднання , де він згадує:

Що сталося? Причина полягає в тому, що крім постачальника_id, ці дві таблиці мають ще одну пару стовпців із загальною назвою. Цей стовпець - ім'я. Отже, коли ви запитуєте про природне з'єднання між постачальником і таблицями частин, з'єднання відбувається не тільки шляхом прирівнювання стовпця_в_допоміж двох таблиць, але і стовпця імен з двох таблиць прирівнюється також. Оскільки жодне ім’я постачальника не збігається з назвою частини цього ж постачальника, запит не повертає жодних рядків.

У розділі "старий синтаксис приєднання" (8i та новіші версії) "NATURAL JOIN" був типовим поведінкою приєднання, і я вважаю, що це все ще є, якщо ви не вказали умову приєднання. Після того, як "НАТУРАЛЬНИЙ ПРИЄДНАЙТЕСЬ" був офіційним варіантом у 9i, загальна рекомендація не використовувати його , тому що неправильне іменування стовпців може вас накрутити, що, на мою думку, я виступаю за гарні назви стовпців.


4
Ви маєте на увазі "Природні об'єднання" у другому абзаці? Якщо так, SHUDDER ... Коли це можливо, ви повинні вказати, як ви хочете, щоб ваша система баз даних приєдналася до ваших таблиць. Якщо залишити його в базі даних для вирішення, це може призвести до несподіваних / непослідовних результатів. Крім того, Natural Joins обмежений об'єднаннями між двома таблицями і, таким чином, відносно обмежений у своїй зручності використання.
ScottCher

2
NATURAL JOIN ніколи не був типовим. Якщо явного приєднання не було / не було дано, декартовий приєднання буде здійснено (тобто кожен рядок у таблиці, приєднаний до кожного та кожного рядка в іншій таблиці). До того, як ANSI приєднався до об'єднань (тобто тих, які вказані в пункті FROM), приєднання повинні бути виконані в пункті WHERE.
Гері

1
-1 для природних приєднань. Коли незв'язана зміна схеми може приєднати приєднання, або ще гірше, змінити їх, не спричиняючи жодних помилок, вас чекає світ болю. Будь ласка, подумайте про дітей, і ЗАВЖДИ вкажіть свої поля приєднання.
Jon of All Trades

2
@ScottCher: "Залишаючи це в базі даних для вирішення" - по-перше, імовірно, ви маєте на увазі "СУБД", а не "базу даних". По-друге, в Оракулі немає ШІ чи антропоморфічного механізму; скоріше, NATURAL JOINдетермінований.
день, коли

1
@Joe cross joinє, був і завжди буде "за замовчуванням". Oracle ніколи не відповідав назві стовпців, якщо natural joinявно не використовувався
Джек Дуглас

1
  1. Ніколи не використовуйте подвійні лапки, "тому що ви переосмислюєте власне складання баз даних. Специфікація SQL вимагає, щоб усі ідентифікатори були складені у верхній регістр. Деякі бази даних, наприклад PostgreSQL, складають їх у малі регістри. Якщо нічого не цитується, воно буде працювати у всіх базах даних, і вони можуть скласти їх на специфікацію або специфічну для rdbms за замовчуванням.
  2. Використовуйте under_score ( _), оскільки, як зазначено вище, не слід використовувати camelCase.
  3. використовувати {entity}_idдля ідентифікаторів (і зовнішніх ключів, що вказують на ці ідентифікатори). Тому що тоді ви можете скористатись USINGпунктом. Унікальні глобальні ключові імена, що використовуються в умовах приєднання, є умовою, встановленою в специфікації.

    SELECT *
    FROM employee
    INNER JOIN department
      USING (department_id);
    
      -- compare to
      ON employee.department_id = department.department_id;

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