|
|
|
| Возникла сложность с пониманием организации таблицы в БД. Опишу ситуацию:
Есть база данных, назовем ее calories. Она содержит несколько таблиц, в том числе таблицу products (продукты) и таблицу users (пользователи). Таблица products содержит в себе список основных(!) продуктов питания, значений калорийности, белка, углеводов и жиров. Таблица содержит начальный список примерно из 20 наиболее употребляемых продуктов.
Предполагается, что каждый пользователь в своем аккаунте после регистрации (первый вход в систему) может видеть этот основной список и может добавлять к нему другие продукты. Однако, видеть продукты, которые добавляют другие пользователи, они не должны. Каждый пользователь может видеть лишь общий список продуктов плюс свои добавленные продукты. Хотя все продукты (как общие, так и добавленные пользователями) заносятся в общую таблицу products.
Вот и вопрос: каким образом можно реализовать такое ограничение для пользователей?
Поскольку я еще новичок в разработке БД, то и не могу пока сообразить.
Подскажите пожалуйста возможные способы решения ситуации.
Спасибо. | |
|
|
|
|
|
|
|
для: baston
(20.04.2010 в 20:43)
| | только через таблицу связи id юзера и id ингредиентов(калорий...)
список примерно из 20 наиболее употребляемых продуктов.
если напишите 200 не ошибётесь :) | |
|
|
|
|
|
|
|
для: oliss
(20.04.2010 в 21:07)
| | 200 не могу, ибо помимо продуктов, пользователи могут добавлять готовые блюда, приготовленные собственноручно. А это совсем не нужно другим пользователям.
У каждого должен быть свой список продуктов и блюд.
Спасибо, ибо о создании спецтаблицы такой я не подумал (да и откуда?). | |
|
|
|
|
|
|
|
для: baston
(20.04.2010 в 20:43)
| |
"SELECT ... WHERE COALESCE(userid, $userid) = $userid"
|
| |
|
|
|
|
|
|
|
для: Trianon
(20.04.2010 в 21:14)
| | Попробовал найти информацию по этой функции, но ничего не понял, кроме того, что она возвращает первое значение, не равное NULL.
Ваш запрос делает выборку, где ненулевое значение из списка соответствует id пользователя.
Пока не могу дошурупить, как это применить к моей ситуации...
...
ага, вроде соображаю... значит мы вытаскиваем только те данные, которые относятся к данному пользователю.
Спасибо за помощь. | |
|
|
|
|
|
|
|
для: 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" | |
|
|
|
|
|
|
|
для: Trianon
(20.04.2010 в 22:51)
| | COALESCE(userid, $userid) = $userid
Trianon,согласитесь ,это насилие,ведь будет полное сканирование всех рядов .
Может проще с таблицей связи по конкретному индексу?
Не спорю ,просто интересная тема , хотя почему нет :) | |
|
|
|