Необходимо или выгодно использовать соглашение об именовании «stuff.whatever» в MySQL?

#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 примерами псевдонимов таблиц, и если да, то как вы их устанавливаете?