Является ли хорошей практикой использование префикса для каждого имени поля в таблице с сокращенным именем таблицы? - PullRequest
8 голосов
/ 21 января 2009

Вы ставите перед каждым полем таблицы префикс с сокращенным именем таблицы?

Пример:

Table: User

Fields:
user_id
user_name
user_password

Или вы минимально называете свои поля?

Fields:
id
name
password

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

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

Ответы [ 14 ]

31 голосов
/ 21 января 2009

Не делай этого. Это избыточно и в конечном итоге приводит к разочарованию.

Единственное поле, к которому вы можете применить, это может быть id, потому что user_id, очевидно, будет идентификатором пользователя и упростит написание соединений в SQL. Но я бы даже этого не сделал.

19 голосов
/ 21 января 2009

если вы сделаете это, вы в конечном итоге будете писать запросы вроде:

SELECT user.user_name, user.user_password, user.user_firstname ...

вместо

SELECT user.name, user.password, user.firstname

так что ИМО ответ на ваш вопрос вполне понятен.

9 голосов
/ 21 января 2009

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

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

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

7 голосов
/ 21 января 2009

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

select user.id, user.name from user where ...

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

Мое мнение: нет веской причины, почему вы должны это делать, и несколько веских причин не делать этого.

4 голосов
/ 21 января 2009

Хорошей практикой может быть добавление префикса к именам столбцов. Если вы работаете с формальной (и, вероятно, большой) базой данных и обращаете внимание на ISO 11179 (в частности, на концепцию имен элементов данных), тогда лучше указать полное три (или четыре) имени части в: Объект - Недвижимость - Представительство Срок. (Четвертая необязательная часть является классификатором.) Например, «user_first_name». Таким образом, вы получаете согласованность между вашим словарем данных и схемой базы данных. Я бы не стал делать это для небольших баз данных по причинам, уже прокомментированным, но в сложной схеме это снижает риск ошибки.

3 голосов
/ 20 июня 2012

Я бы рекомендовал придерживаться псевдонимов таблиц, например:

SELECT 
    user.id,
    user.email, 
    user.firstname, 
    user.secondname,
    avatar.filename
FROM
    pain_in_the_butt_table_name user
LEFT JOIN
    table_with_the_avatars avatar
ON avatar.user_id = user.id

Преимущества:

  • ведение легко понятного списка выбранных вами полей и таблиц, из которых вы берете их

  • избегайте ввода длинных или сложных для понимания имен таблиц и заменяйте их короткими и понятными именами (что вы должны были сделать при создании таблицы)

  • выполнить соединения, которые доступны для чтения (ваш пример будет выглядеть так:

LEFT JOIN table_with_the_avatars.user_id ON user.user_id = table_with_the_avatars.avatars_user_i

  • создайте еще более короткие псевдонимы, в моем примере это будет означать, что вы вместо пользователя, и вместо аватара, сокращая ваш запрос
3 голосов
/ 21 января 2009

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

Однако есть одна ситуация, в которой мы делаем: резервные поля .

 e.g. OH_Reserve_Field_Alpha3 in table ORDER_HEADER

Краткая справка: наша база данных насчитывает 250+ таблиц, и мы поместили в большинство из них резервные столбцы, чтобы использовать их для будущих реализаций функций. Как вы можете себе представить, без префикса у вас получилось бы 50 Reserve_Field_Alpha3 с совершенно другим значением, но с одинаковым именем в коде. Это уже сложно, как сейчас, но без префиксов было бы хуже.

2 голосов
/ 21 января 2009

Лично в таблице 'user' мой столбец будет просто 'id'.

Но если бы все ключевые столбцы в разных таблицах указывали на этот столбец, я бы назвал столбец user_id.

так что вы можете получить что-то вроде этого:

select  *
from    order
        inner join user
            on user.id=order.user_id
2 голосов
/ 21 января 2009

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

MediaWiki (программное обеспечение Wikipiedia) использует это соглашение. Загрузите источник. Они ограничивают себя двухсимвольным префиксом.

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

1 голос
/ 21 января 2009

Можно называть поля таким образом (минимально), но для первичного ключа и заголовков / имени. Если вы последовательно называете весь свой первичный ключ идентификатором, а имя - именем, построение запроса выродится в лишние псевдонимы:

select i.id as invoice_id

v.id as vendor_id, p.id as product_id, 
v.name as vendor, p.name as product, b.name as branch, c.name as parcel,

i.total_amount,
i.discount,
i.invoice_date

from invoice i
join product p on i.product_id = p.id
join vendor v on i.vendor_id = v.id
join branch b on i.branch_id = b.id
join parcel c on i.parcel_id = c.id

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

create table product
(
product_id uuid not null, -- primary key
product text not null,
bar_code text not null default '',
rfid_code text  not null default '',
current_qty int default 0
);

create table vendor
(
vendor_id uuid not null, -- primary key
vendor text not null,
is_active boolean not null default true
);

create table branch
(
branch_id uuid not null, -- primary key
branch text not null,
sub_branch_of_id uuid,
current_sales money not null default 0,        
);

create table user
(
user_id uuid not null, -- primary key
user text not null,
password text not null default ''
);

Таким образом, в вашем запросе не будет лишних псевдонимов:

select i.invoice_id, p.product_id, v.vendor, p.product, b.branch, c.parcel,

i.total_amount,
i.discount,
i.invoice_date

from invoice i
join product p on o.product_code = p.product_code
join vendor v on o.vendor_code = v.vendor_code
join branch b on o.branch_code = b.branch_code
join parcel c on o.parcel_code = c.parcel_code
...