#mysql #naming-conventions
#mysql #соглашения об именовании
Вопрос:
Я работаю над базой данных MySQL для сайта социальной сети, который я создаю, и до сих пор это был отличный опыт обучения. Однако, в частности, была одна вещь, которая всегда меня смущала.
При поиске ответов на конкретную проблему я вижу так много примеров, которые используют точки в своих соглашениях об именовании в своих запросах MySQL. Например:
SELECT c.id, c.comment, c.user_id, u.username, u.photo
FROM (comments c)
JOIN users u ON c.user_id = u.id
WHERE c.topic_id = 9
и вот еще один пример:
SELECT fb.auto_id, fb.user_id, fb.bulletin, fb.subject, fb.color, fb.submit_date, fru.disp_name, fru.pic_url
FROM friend_bulletin AS fb
LEFT JOIN friend_friend AS ff ON fb.user_id = ff.userid
LEFT JOIN friend_reg_user AS fru ON fb.user_id = fru.auto_id
WHERE (
ff.friendid =1
AND ff.status =1
)
LIMIT 0 , 30
Есть ли особая выгода в использовании точек в именах? Как человек, который много работает с CSS, на первый взгляд точки кажутся мне какой-то ассоциацией между разными вещами, но для чего они здесь?
Полагаю, я просто хочу убедиться, что я не делаю свою структуру базы данных / запросы менее эффективными, не используя это соглашение об именовании «точка». Если бы кто-нибудь мог объяснить мне в терминах непрофессионалов, для чего они используются, я был бы очень признателен.
Ответ №1:
stuff.whatever
следует рассматривать как table_name.column_name
. Вы явно связываете каждую ссылку на столбец с таблицей, к которой она принадлежит, что, ИМХО, является лучшей практикой для подражания.
Комментарии:
1. @RedFilter правильно. Независимо от того, используется ли полное имя таблицы или псевдоним, концепция одна и та же.
2. @Joe, это вроде как то, о чем я подумал, но что, если вы выберете столбец с
SELECT column_name
помощью, а затем таблицу сFROM table_name
помощью . Если вы используетеSELECT table_name.column_name
, какую цель вы бы использовалиFROM
? Я все еще в замешательстве.3. @vertigoelectric Вы пытаетесь сказать
FROM
, что предложение не должно требоваться просто потому, что вы полностью указали столбец вSELECT
? Это просто нарушает базовый синтаксис SQL.4. Вам нужно предложение FROM, потому что, если вы выбираете из более чем одной таблицы, тогда вы выполняете соединение, и поэтому вам нужно указать, какой тип соединения и каково условие соединения.
5. @Joe, нет, я этого не предлагаю. На самом деле все наоборот. Какую цель имеет указание
SELECT table_name.column_name
, если они указывают имя таблицы, используяFROM
? Мне это кажется излишним, и я хотел бы знать, в чем преимущество использования чего-то вродеSELECT table_name.column_name
.
Ответ №2:
Вы не должны думать о точках как о части «соглашения об именовании». Функциональность больше похожа на вызов атрибута для объекта.
В случае stuff.whatever
«stuff» представляет таблицу базы данных и whatever
представляет данные в столбце с именем «whatever» в базе данных.
Если вы видели столбец, на который ссылаются без табличной части, это потому, что пользователь ожидает, что mysql выяснит, какой столбец они имеют в виду.
Если в запросе есть только одна таблица со столбцом с таким именем, mysql может это сделать, без проблем.
Но, например, у вас есть таблица «facebook» и таблица «twitter», и вы соединяете их с помощью запроса, потому что у них обоих есть столбец «user_id» или что-то в этом роде, и у них ОБОИХ есть столбец «avatar_image», и вы не указали таблицу, mysql выдаст сообщение об ошибкевы не знали точно, о чем просили.
Комментарии:
1. Хорошо, я думаю, я понимаю, как это работает. Есть ли какая-то конкретная выгода в том, чтобы делать это таким образом? Во всей моей работе я просто использую
SELECT column FROM table
. Разве это не будет по сути делать то же самое? Кроме того, в приведенных выше примерах пользователь использовал как ассоциацию точек, так ИFROM
предложение, что мне кажется излишним, если целью ассоциации точек является указание, из какой таблицы оно взято в первую очередь. Посмотрите, где я могу запутаться здесь?2. Я не верю, что есть преимущество в производительности вообще. Они делают по сути то же самое, если только таблица, к которой вы присоединились, не имеет столбца с тем же именем, например: Pet -id -name -owner_id Owner -id -name
SELECT name FROM pet LEFT JOIN owner ON owner.id = pet.owner_id
вызовет ошибку, mysql скажет:Column 'name' in field list is ambiguous if you told mysql that you wanted the owner name:
SELECT owner.name ОТ питомца СЛЕВА ПРИСОЕДИНИТЬСЯ к владельцу НА owner.id = домашнее животное.owner_id` это работает, как если бы вы использовали псевдонимыSELECT o.name FROM pet p LEFT JOIN owner o ON owner.id = pet.owner_id
Ответ №3:
Нет ничего плохого в использовании соглашений о полных именах, однако, если у вас длинные table
field
имена, проще использовать псевдоним для удобства чтения.
Комментарии:
1. Я продолжаю слышать термин «псевдоним» для имен таблиц. Не могли бы вы объяснить мне это более подробно, пожалуйста? В первом примере, который я опубликовал, человек использует
c.comment
иu.username
. Являютсяc
ли иu
примерами псевдонимов таблиц, и если да, то как вы их устанавливаете?