|
|
|
| Какой запрос лучше использовать: многотабличный или однотабличный?
Ситуация:
таблица "категории"
поля
- ID
- name
таблица "статьи"
поля
- ID
- name
- cat_id
-------------------
(упрощенно)
Нужно сделать выборку статей, чтобы был вид
статья.name | категория.name
В данном случае приходится делать многотабличный запрос. Что лучше: изменить в таблице cat_id на cat_name или оставить все как есть? Не нарушится ли правильность внешних ключей, т.к. поле cat_name не является уникальным? | |
|
|
|
|
|
|
|
для: kssnick
(27.08.2007 в 09:30)
| | Если статей будет много (несколько сотен), то лучше в цикле выполнить несколько однотабличных запросов, если же статей не много и нагрузки не наблюдается, можно использовать многотабличный запрос (это удобнее). | |
|
|
|
|
|
|
|
для: kssnick
(27.08.2007 в 09:30)
| | В данном случае следует использовать многотабличный запрос.
Возможно, в некоторых ситуациях (мало категорий и очень много статей) будет иметь смысл издать два запроса. Но никак не запрос в цикле. | |
|
|
|
|
|
|
|
для: Trianon
(27.08.2007 в 13:26)
| | Что Вы имеете в виду под выражением: запрос в цикле?
У меня (сейчас) один запрос, извлекающий все записи из таблицы статей, при условии что art.cat_id = cat.cat_id.
Есть боьшой соблазн поменять поле cat_id на cat_name, потому что предполагается достаточно большое количество статей.
Будет ли такой способ правильным с точки зрения внешних ключей, т.к. на сколько я помню курс по БД внешний ключ должен ссылаться на уникальное поле (а лучше на primary key). Эсли я ничего не путаю... | |
|
|
|
|
|
|
|
для: kssnick
(27.08.2007 в 15:32)
| | >У меня (сейчас) один запрос, извлекающий все записи из таблицы статей, при условии что art.cat_id = cat.cat_id.
Это не соответствует описанию таблиц в начале темы.
Вот запрос, отвечающий Вашей задаче.
SELECT
art.*,
cat.id as category_id,
cat.name as category_name,
FROM art
LEFT JOIN cat ON art.cat_id = cat.id.
|
>Есть боьшой соблазн поменять поле cat_id на cat_name, потому что предполагается достаточно большое количество статей.
Вы пытаетесь заниматься оптимизацией еще до того, как она потребовалась.
Так ли уж сильно повысится эффективность - это еще вопрос открытый.
Пострадает схема БД - она станет денормализованной, с ней будет неудобно работать, в первую очередь Вам самим.
Конкретно в Вашем случае, названия категорий при необходимости внести изменения, придется исправлять не только в таблице категорий, но и в таблице статей. А это не одна строка, а многие.
>Будет ли такой способ правильным с точки зрения внешних ключей, т.к. на сколько я помню курс по БД внешний ключ должен ссылаться на уникальное поле (а лучше на primary key). Эсли я ничего не путаю...
Не будет.
>Что Вы имеете в виду под выражением: запрос в цикле?
Это cheops имеет в виду (то лучше в цикле выполнить несколько однотабличных запросов).
Я лишь с ним спорю. | |
|
|
|
|
|
|
|
для: Trianon
(27.08.2007 в 16:20)
| | У меня сейчас такой запрос (не знаю насколько он верен)
SELECT articles.art_id, articles.art_name, articles.cat_id, categories.cat_id
FROM articles, categories WHERE articles.cat_id=categories.cat_id;
|
Вот собственно и всё. | |
|
|
|
|
|
|
|
для: kssnick
(28.08.2007 в 08:50)
| | Запрос практически равнозначен тому, что написал я.
Отличия:
1. при отсутствии категории для какой-либо статьи мой запрос вернет известные данные о статье, Ваш - не покажет статью вообще.
2. Не возвращается информация об имени категории.
3. поскольку есть схожие имена столбцов - выбирать поля придется по номеру, а не по имени. Но с учетом п.1. в обоих полях будет лежать одно и то же.
4. стиль. Но это дело вкуса.
В остальном запросы совпадают. | |
|
|
|