Мне недавно дали задание создать аукционную систему. Во время работы я встречал множество случаев, когда мои SQL-запросы, содержащие соединения, не выполнялись из-за неоднозначных имен столбцов. Рассмотрим эту (упрощенную) структуру таблицы для аукциона:
таблица аукцион
:
id
name
uid
(ID пользователя, создавшего аукцион) таблица пункт
:
id
имя
uid
(ID пользователя, добавившего товар) help
(ID аукциона, на котором товар доступен) цена
(начальная цена) таблица пользователь
:
id
имя
таблица ставка
:
id
uid
(идентификатор пользователь, сделавший ставку) iid
(товар, цена которого была повышена) цена
(предложенная цена) Как видите, существует множество столбцов с конфликтующими названиями. Объединение этих таблиц требует использования некоторых мер, которые устранят двусмысленность.
Я могу придумать два способа сделать это. Сначала нужно переименовать столбцы, добавив к ним префикса сокращенного имени таблицы, так что идентификатор аукциона станет a_id
, идентификатор товара станет i_id
, а идентификатор позиции в таблице bid
станет b_i_id
. Это довольно надежно, но снижает удобочитаемость имен столбцов.
Другой способ, который я могу придумать, - это написание явных запросов:
SELECT `bid`.`id`, `user`.`name`, `bid`.`price`
FROM `bid`
JOIN `item` ON `item`.`id` = `bid`.`iid`
JOIN `user` ON `user`.`id` = `bid`.`uid`
JOIN `auction` ON `auction`.`id` = `item`.`aid`
WHERE `bid`.`price` > `item`.`price`
AND `auction`.`id` = 1
GROUP BY `user`.`id`
ORDER BY `bid`.`price` DESC;
Это читабельно и однозначно, но требует большого количества дополнительных нажатий клавиш.
Я использую второй подход, но, может быть, есть другие, которые вы успешно использовали в подобных ситуациях? Как избежать конфликтов имен столбцов в ваших SQL-запросах?