Здравствуйте! Помогите, пожалуйста,спроектировать базу данных.
Предполагается, что в базе хранится описание некоего развлекательного комплекса(название, описание, количество персонала, и другие параметры). В этом комплексе есть магазины(название, короткое описание, полное описание, дата открытия, и другие параметры).
На главную страницу надо вывести всё это дело, но(!) тут есть одно но.
Если в комплексе всего один магазин, то выводим название магазина, полное описание и дату открытия. Если в комплексе не один магазин, то выводим название комплекса, описание комплекса и короткие описания всех его магазинов.
С построением такой сложной(для меня) системы столкнулся впервые. Уже несколько дней думаю над тем, как именно организовать базу данных, чтобы можно было без проблем всё это из нее вытащить при минимальной нагрузке на сервер. Может кто-то имеет опыт работы со сложными таблими и сложными запросами?Очень бы хотелось услышать какой-либо из ваших вариантов проектирования данной базы и, если можно, пример запроса
17 марта 2010 в 17:01
сорри, понял о чем Вы, да, ошибка
нужно ON complex.id = shops.complex_id вместо ON complex.id == shops.complex_id
17 марта 2010 в 17:00
а что это за сравнение в sql:
FROM complex JOIN shops ON complex.id == shops.complex_id
давно вввели?
17 марта 2010 в 17:00
INNER JOIN ? google ?
17 марта 2010 в 12:03
SELECT complex.id, complex.count_shops, complex.title, complex.descr, complex.count_workers,shops.id,shops.complex_id,shops.title,shops.full_desrc,shops.short_desrc,shops.count_workers,shops.creation_date
FROM complex JOIN shops ON complex.id == shops.complex_id
запрос по идее может быть примерно таким, ну или таким :
SELECT C.id, C.count_shops, C.title, C.descr, C.count_workers,S.id,S.complex_id,S.title,S.full_desrc, S.short_desrc,S.count_workers,S.creation_date
FROM complex AS C JOIN shops AS S
ON complex.id == shops.complex_id
p.s. в таблице complex у тебя есть`litle` varchar(255) NOT NULL, мб ты тут хотел все же title написать, а не litle?
17 марта 2010 в 10:00
#8 явная ошибка проектирования базы, как в #11 гораздо лучше.
В #9 рациональное начало есть, только можно еще в запросе проверять кол-во магазинов чтобы лишний раз не отправлять запрос. По уму, раз уж так печетесь о лишнем запросе, то введите поле, shops_count в таблице с комплексами и повесьте триггер, который будет сам считать кол-во магазинов и сразу можно в запросе сделать что-то вроде IF(shops_count=1,'select всю инфу о магазе', 'выбираем которткую инфу о всех магазинах')
17 марта 2010 в 0:02
Guran Guran, для генерации страницы, допустим с20тью комплексами, таким методом, мы получим тонну запросов в базу оО
Андрей, да, так наверное будет лучше.
На всякийслучай вот актуальный дамп базы //dumpz.org/17716/
17 марта 2010 в 0:02
ну пардон.. сказал как знал.
если есть что-то лучше, как узнаешь поделись, буду рад.
16 марта 2010 в 23:05
хм, может стоило бы убрать строку `shops_id` varchar(255) NOT NULL, а то получается, что имея комплекс с 1000 магазинами, ты получишь не 1 строку с комплексом в БД, а 1000…явный избыток,попробуй просто в shops добавь id комплекса, в котором этот магазин находится, так будет разумнее, а в complex можно оставить строку с кол-вом магазином в нем и все
16 марта 2010 в 23:03
$sql = "SELECT id FROM kompleks";
$res = mysql_query($res);
if(mysql_num_rows($res) > 1){
while($row =mysql_fetch_array($res)){
$sql2 = "SELECT * FROM magazin WHERE id_kompleks_fk='" . $row['id'] . " ' ";
$res2 = mysql_query($sql2);
while($row2 =mysql_fetch_array($res2)){
echo "<td>" . $row['nazvanie_kompleksa'] . "</td>";
echo " остальная инфа … если магазинов больше чем 1";
}
}else{
while($row =mysql_fetch_array($res)){
$sql2 = "SELECT * FROM magazin WHERE id_kompleks_fk='" . $row['id'] . " ' ";
$res2 = mysql_query($sql2);
while($row2 =mysql_fetch_array($res2)){
echo "инфа если магазин 1";
}
}
16 марта 2010 в 22:05
Вот пока такая таблица получилась//dumpz.org/17708/
Сделал еще небольшую картинку для наглядности //s002.radikal.ru/i198/1003/8d/c0d9a22ac8b5.jpg
Сейчас пробую сделать выборку из получившейся базы данных.
Только пока не очень представляю, как выбрать это всё
16 марта 2010 в 18:00
угу, в первой таблице будет инфа о комплексах, вторая будет содержать инфу про магазины, но в первой будет id магазинов, и делая выборку из первой таблицы ,можно сразу сделать условие с проверкой, один магазин или более в этом комплексе
16 марта 2010 в 15:02
викуля молодец, когда нечегео сказать надо сказать хоть что-то, я так понимаю?!
решается данный вопрос программно, по сути тут две таблицы. Select'ом выгребаешь комплексы, а дальше куча решений, голь на выдумку хитра.
Можно и подзапросом все вернуть сразу, как душе угодно
16 марта 2010 в 14:05
их будет больше чем один, и у каждого может быть n'ное количество магазинов. И надо как-то выводить на одной странице все комплексы.
Не могу продумать строение базы данных, что это все извлекалось без лишних параметров
16 марта 2010 в 8:03
комплексов может быть более чем один, правильно?
16 марта 2010 в 7:04
Причем тут mysql_num_rows?
16 марта 2010 в 1:02
mysql_num_rows ?
Это всё легко делается, но это нужно видеть и представлять перед собой:)