Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как организовать БД по конкретному примеру?
 
 автор: baston   (20.04.2010 в 20:43)   письмо автору
 
 

Возникла сложность с пониманием организации таблицы в БД. Опишу ситуацию:
Есть база данных, назовем ее calories. Она содержит несколько таблиц, в том числе таблицу products (продукты) и таблицу users (пользователи). Таблица products содержит в себе список основных(!) продуктов питания, значений калорийности, белка, углеводов и жиров. Таблица содержит начальный список примерно из 20 наиболее употребляемых продуктов.

Предполагается, что каждый пользователь в своем аккаунте после регистрации (первый вход в систему) может видеть этот основной список и может добавлять к нему другие продукты. Однако, видеть продукты, которые добавляют другие пользователи, они не должны. Каждый пользователь может видеть лишь общий список продуктов плюс свои добавленные продукты. Хотя все продукты (как общие, так и добавленные пользователями) заносятся в общую таблицу products.

Вот и вопрос: каким образом можно реализовать такое ограничение для пользователей?
Поскольку я еще новичок в разработке БД, то и не могу пока сообразить.
Подскажите пожалуйста возможные способы решения ситуации.
Спасибо.

  Ответить  
 
 автор: oliss   (20.04.2010 в 21:07)   письмо автору
 
   для: baston   (20.04.2010 в 20:43)
 

только через таблицу связи id юзера и id ингредиентов(калорий...)
список примерно из 20 наиболее употребляемых продуктов.
если напишите 200 не ошибётесь :)

  Ответить  
 
 автор: baston   (20.04.2010 в 22:40)   письмо автору
 
   для: oliss   (20.04.2010 в 21:07)
 

200 не могу, ибо помимо продуктов, пользователи могут добавлять готовые блюда, приготовленные собственноручно. А это совсем не нужно другим пользователям.
У каждого должен быть свой список продуктов и блюд.
Спасибо, ибо о создании спецтаблицы такой я не подумал (да и откуда?).

  Ответить  
 
 автор: Trianon   (20.04.2010 в 21:14)   письмо автору
 
   для: baston   (20.04.2010 в 20:43)
 

"SELECT ...  WHERE COALESCE(userid, $userid) = $userid"

  Ответить  
 
 автор: baston   (20.04.2010 в 22:48)   письмо автору
 
   для: Trianon   (20.04.2010 в 21:14)
 

Попробовал найти информацию по этой функции, но ничего не понял, кроме того, что она возвращает первое значение, не равное NULL.

Ваш запрос делает выборку, где ненулевое значение из списка соответствует id пользователя.
Пока не могу дошурупить, как это применить к моей ситуации...
...
ага, вроде соображаю... значит мы вытаскиваем только те данные, которые относятся к данному пользователю.

Спасибо за помощь.

  Ответить  
 
 автор: Trianon   (20.04.2010 в 22:51)   письмо автору
 
   для: baston   (20.04.2010 в 22:48)
 

>ага, вроде соображаю... значит мы вытаскиваем только те данные, которые относятся к данному пользователю.

а также те данные, которые не отнесены ни к кому.

PS. Собственно, можно не извращаться, и написать проще
"SELECT ... WHERE userid IS NULL OR userid = $userid"

PPS. Если еще чуть-чуть подумать, то окажется нелишним таки назначить общим данным конкретный userid.
Чтобы вытаскивать строки по индексу: А не полным сканированием.

"SELECT ... WHERE userid = $public_id OR userid = $user_id"

  Ответить  
 
 автор: oliss   (21.04.2010 в 01:41)   письмо автору
 
   для: Trianon   (20.04.2010 в 22:51)
 

COALESCE(userid, $userid) = $userid
Trianon,согласитесь ,это насилие,ведь будет полное сканирование всех рядов .
Может проще с таблицей связи по конкретному индексу?
Не спорю ,просто интересная тема , хотя почему нет :)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования