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


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.