Задавайте вопросы, мы ответим
Вы не зашли.
База с объявлениями.
Созданы таблицы -
RAZDEL (id_razdel, name ... )
USER (id_user, name ... )
GOROD (id_gorod, name ... )
ADVERT (id_advert, id_razdel, id_user, id_gorod, head, body ...дополнительные поля однотипные для всех объявлений...)
Пока в базе хранятся однотипные объявления все понятно, а вот если необходимо что бы в зависимости от типа раздела к объявлению добавлялись специальные для раздела поля как тут быть?
Моё решение это ввести доп таблицу
TYPERAZDEL (id_type, name, prefix)
в RAZDEL добавить (id_razdel, name ... , id_type)
А потом по префиксу создавать таблицы, которые связывать с ADVERT как один к одному, т.е. в таблице ADVERT будут храниться все общие для всех объявлений поля, а в таблицах с именем PREFIX-1, PREFIX-2, PREFIX-3 дополнительные поля для объявлений разных типов.
Правильна ли такая организация базы или можно и нужно сделать по другому?
Неактивен
Ну или так, или в принципе иметь несколько табличек под независимые вещи.
Плюс Вашего подхода — возможность сквозной нумерации объектов. Плюс
подхода с раздельными табличками — простота базы и легкость выборок.
Неактивен
А если использовать второй подход у меня получится выбрать, например, 10 последних добавленных объявлений?
Отредактированно durable (21.08.2009 13:18:25)
Неактивен
Если имеются в виду объявления любых типов — то ответ: можно, но сложнее, чем
в случае одной таблички — прийдется делать объединение. Выбор, разумеется, стоит
основывать на том, какие запросы Вам приоритетнее.
Неактивен
Я понял. Спасибо.
А вот еще вопрос для выбранной мной структуры:
Можно ли сделать такой запрос:
Необходимо выбрать значения некоторых полей из общей таблицы ADVERT и все поля из соответствующей префикс таблицы PREFIX-х для указанного ID объявления.
В два запроса это понятно как сделать
1) по ID объявления через RAZDEL в TYPERAZDEL узнать префикс таблицы с дополнительной инфой
2) зная префикс составить второй запрос на извлечение всех данных для одного объявления из таблицы ADVERT и полученной в первом запросе таблице с именем PREFIX-х
Можно ли одним запросом организовать такую выборку?
Отредактированно durable (21.08.2009 15:32:22)
Неактивен
Это нельзя сделать хотя бы с точки зрения логики. Пусть есть общая табличка
common, отдельно таблички a и b для двух типов:
common (id, prefix)
a (id, a)
b (id, b)
У табличек a и b нет пересекающихся полей (они могут быть даже разных типов),
поэтому нельзя выбрать что-то из common и из этих табличек одновременно. Т.е.
Вам каждый раз нужно конкретизировать, какого типа записи Вы хотите получить.
Ну или доставать только из common. Если же в табличках a и b хранятся поля вида
«и другой мусор» (т.е. те, по которым никогда не производится выборка), то тогда
можно попробовать обращаться с ними как с мусором — т.е. сделать поле blob в
common и вообще не заморачиваться с отдельными таблицами.
Неактивен
Да но таблица ADVERT и PREFIX-A имеют общее поле id_advert по которому они и связаны.
А вот табличка COMMON (ну или TYPERAZDEL) как раз и содержит имя таблицы PREFIX-A в которой и хранятся дополнительные поля для объявления. Вобщем все они завязаны через идентификатор объявления.
А данные из таблицы PREFIX-A хранят дополнительную информацию для объявлений какого то типа.
В таком случае с точки зрения логики все нормально?
Неактивен
Нет, не нормально. Пусть у Вас в common лежат две записи — одна соответствует
табличке a, вторая — табличке b. Какие данные Вы хотите достать для таких строк?
Неактивен
Вот теперь я понял, что вы имеете в виду.
Да в таком случае действия не имеют логики...
Но я говорю о другом!
Я спрашиваю можно ли в одном запросе узнать имя таблицы с дополнительной информацией (в вашем примере это или "а" или "b") из какой то третьей таблицы, и тут же выполнить запрос на извлечение данных из общей таблицы (common) и одной из дополнительных (a или b)?
Уже сам запутался как бы понятней объяснить
Неактивен
Если интересует только одна строка из common — конкретный тип,
то — да, можно:
SELECT c.*, a.*
FROM common c JOIN a USING(id)
WHERE c.type = 'a';
Неактивен