Ограничения SQL для нескольких таблиц

У меня возникли трудности с проектированием этой таблицы и ограничений для нее.

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

Yummy <- value 5.
OK <- value 3.
Disgusting <- value 1.

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

В настоящее время у меня есть невероятная простая БД, которая:

User(id, name)
Meal(id, name)
Yummy(id, userid, mealid) where userid id and mealid are foreign keys.
OK(id, userid, mealid) where userid id and mealid are foreign keys.

Что я хотел бы сделать, так это сделать так, чтобы если я вставил лазанью в Yummy, я не мог также вставить это значение в 'OK' или 'Disgusting'. Я думаю, что ограничение как для meid, так и для userid, возможно, является правильным подходом, но я немного не в себе.

Любая помощь или предложения будут очень признательны.

Вкуснятина, хорошо, отвратительно - это «Статус», возможно, позже вы захотите SUPERB или не подходит для категорий потребления человеком. вы не хотите добавлять таблицы, поэтому таблица рейтинга имеет смысл. Uueerodo хорошо разбирается в дизайне, чтобы поддержать это. И это гарантирует, что блюдо пользователя может быть оценено только один раз.

xQbert 05.04.2019 19:28

@xQbert - да, конечно. это имеет смысл, и вполне может появиться больше столов, которые будет сложно поддерживать. Я не могу представить ответ, опубликованный в данный момент - заканчиваются мозговые циклы: D

steve 05.04.2019 19:36
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
2
38
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам, вероятно, лучше подойдет дизайн базы данных, подобный этому:

user (id, name)
meal (id, name)
rating (id, name, value)
user_meal_rating (user_id, meal_id, rating_id) *primary key on (user_id, meal_id)*

Привет, спасибо, что нашли время ответить! Следуя этой модели, смогу ли я, чтобы несколько пользователей выбирали несколько блюд, но оценивали их по-разному? При этом не имея возможности поесть в «других» рейтингах пользователей. Извините за вопрос, который может показаться глупым, я плохо себе это представляю. Значения, которые я связывал с Yummy и т. д., должны были использоваться программно, а не сохраняться, хотя их сохранение, безусловно, позволило бы изменить их быстрее, так что это также лучший подход. :)

steve 05.04.2019 19:32

первичный ключ (user_id, food_id) не позволит любому пользователю оценить блюдо дважды, но позволит разным пользователям оценивать блюда по-разному. Одним из способов визуализации user_meal_rating может быть сетка, в которой столбцы — это приемы пищи, строки — это пользователи, а каждая ячейка содержит один рейтинг.

Uueerdo 05.04.2019 19:44

Кроме того, технически вы должны хранить рейтинги в базе данных; они могут быть значениями, ссылающимися на перечисление на стороне клиента (хотя тогда каждая реализация клиента должна была бы отражать перечисление). Другая альтернатива может просто избавиться от концепции «рейтинг-имя-значение» и сделать рейтинг значением от 1 до 10, где чем выше, тем лучше.

Uueerdo 05.04.2019 19:51

Ах, спасибо, это имеет смысл :) Большое вам спасибо

steve 05.04.2019 19:56

извините, что оживляю это, но у меня есть вопрос, и мне было интересно, не могли бы вы помочь. Есть ли причина, по которой в приведенном выше дизайне не должно быть имени пользователя и названия блюда в таблице user_meal_rating? Я полагаю, что буду использовать его довольно часто, поэтому мог бы извлечь из него все, что мне нужно, вместо того, чтобы затем переходить к пользовательской таблице с идентификатором, чтобы получить имя и т. д.

steve 05.04.2019 21:23

На самом деле нет особых причин использовать такие вещи, как имена, где-либо, кроме исходной таблицы; и многочисленные причины не делать этого. Если бы вы использовали имя пользователя в user_meal_rating; вы бы: заняли больше места для хранения имени в каждом рейтинге; на самом деле сделать поиск в таблице сложнее (с уникальным идентификатором требуется одно сравнение, чтобы определить, является ли строка той, которую вы ищете, но требуется 4 сравнения, чтобы различить, предназначена ли строка для «Джош» или «Хосе»); усложнить обновление (если кто-то опечатал имя, его нужно было бы изменить везде)... и это игнорирует, что у вас, вероятно, будет более одного «Джона».

Uueerdo 05.04.2019 22:12

Спасибо. Я думаю, я смотрел на это с точки зрения приложения, поскольку мне нужно будет так или иначе извлечь эти данные, и сделать один вызов (к одной таблице) может быть более эффективным, но я понимаю, почему это не так, Спасибо!

steve 05.04.2019 23:10

Другие вопросы по теме