SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 20.08.2009 10:15:28

durable
Участник
Зарегистрирован: 20.08.2009
Сообщений: 5

Помогите правильно организовать базу

База с объявлениями.
Созданы таблицы -
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 дополнительные поля для объявлений разных типов.

Правильна ли такая организация базы или можно и нужно сделать по другому?

Неактивен

 

#2 20.08.2009 14:36:45

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Помогите правильно организовать базу

Ну или так, или в принципе иметь несколько табличек под независимые вещи.
Плюс Вашего подхода — возможность сквозной нумерации объектов. Плюс
подхода с раздельными табличками — простота базы и легкость выборок.

Неактивен

 

#3 21.08.2009 13:16:21

durable
Участник
Зарегистрирован: 20.08.2009
Сообщений: 5

Re: Помогите правильно организовать базу

А если использовать второй подход у меня получится выбрать, например, 10 последних добавленных объявлений?

Отредактированно durable (21.08.2009 13:18:25)

Неактивен

 

#4 21.08.2009 13:27:34

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Помогите правильно организовать базу

Если имеются в виду объявления любых типов — то ответ: можно, но сложнее, чем
в случае одной таблички — прийдется делать объединение. Выбор, разумеется, стоит
основывать на том, какие запросы Вам приоритетнее.

Неактивен

 

#5 21.08.2009 15:29:21

durable
Участник
Зарегистрирован: 20.08.2009
Сообщений: 5

Re: Помогите правильно организовать базу

Я понял. Спасибо.
А вот еще вопрос для выбранной мной структуры:

Можно ли сделать такой запрос:

Необходимо выбрать значения некоторых полей из общей таблицы ADVERT и все поля из соответствующей префикс таблицы PREFIX-х для указанного ID объявления.

В два запроса это понятно как сделать
1) по ID объявления через RAZDEL в TYPERAZDEL узнать префикс таблицы с дополнительной инфой
2) зная префикс составить второй запрос на извлечение всех данных для одного объявления из таблицы ADVERT и полученной в первом запросе таблице с именем PREFIX-х

Можно ли одним запросом организовать такую выборку?

Отредактированно durable (21.08.2009 15:32:22)

Неактивен

 

#6 21.08.2009 16:10:03

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Помогите правильно организовать базу

Это нельзя сделать хотя бы с точки зрения логики. Пусть есть общая табличка
common, отдельно таблички a и b для двух типов:
  common (id, prefix)
  a (id, a)
  b (id, b)

У табличек a и b нет пересекающихся полей (они могут быть даже разных типов),
поэтому нельзя выбрать что-то из common и из этих табличек одновременно. Т.е.
Вам каждый раз нужно конкретизировать, какого типа записи Вы хотите получить.
Ну или доставать только из common. Если же в табличках a и b хранятся поля вида
«и другой мусор» (т.е. те, по которым никогда не производится выборка), то тогда
можно попробовать обращаться с ними как с мусором — т.е. сделать поле blob в
common и вообще не заморачиваться с отдельными таблицами.

Неактивен

 

#7 21.08.2009 16:15:32

durable
Участник
Зарегистрирован: 20.08.2009
Сообщений: 5

Re: Помогите правильно организовать базу

Да но таблица ADVERT и PREFIX-A имеют общее поле id_advert по которому они и связаны.
А вот табличка COMMON (ну или TYPERAZDEL) как раз и содержит имя таблицы PREFIX-A в которой и хранятся дополнительные поля для объявления. Вобщем все они завязаны через идентификатор объявления.
А данные из таблицы PREFIX-A хранят дополнительную информацию для объявлений какого то типа.

В таком случае с точки зрения логики все нормально?

Неактивен

 

#8 21.08.2009 17:01:59

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Помогите правильно организовать базу

Нет, не нормально. Пусть у Вас в common лежат две записи — одна соответствует
табличке a, вторая — табличке b. Какие данные Вы хотите достать для таких строк?

Неактивен

 

#9 21.08.2009 18:10:05

durable
Участник
Зарегистрирован: 20.08.2009
Сообщений: 5

Re: Помогите правильно организовать базу

Вот теперь я понял, что вы имеете в виду.
Да в таком случае действия не имеют логики...

Но я говорю о другом!
Я спрашиваю можно ли в одном запросе узнать имя таблицы с дополнительной информацией (в вашем примере это или "а" или "b") из какой то третьей таблицы, и тут же выполнить запрос на извлечение данных из общей таблицы (common) и одной из дополнительных (a или b)?

Уже сам запутался как бы понятней объяснить smile

Неактивен

 

#10 21.08.2009 18:23:20

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Помогите правильно организовать базу

Если интересует только одна строка из common — конкретный тип,
то — да, можно:

SELECT c.*, a.*
FROM common c JOIN a USING(id)
WHERE c.type = 'a';

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson