Я работаю над небольшим сайтом доставки пиццы и столкнулся с небольшой проблемой с таблицами MySQL.
Я нашел это в Stackoverflow: https://stackoverflow.com/a/10322293/80907
В нем упоминается следующее:
- Обе таблицы должны использовать механизм INNODB.
- «В таблице ссылок должен быть индекс, в котором столбцы внешнего ключа перечислены как первые столбцы в том же порядке».
Первое на самом деле не проблема, но второе правило — это то, где я чешу затылок.
Это сайт, на котором можно заказать пиццу, поэтому я сохраняю все данные о пользователях и их заказах в базе данных.
Вот скриншот того, что я собираюсь написать:
Итак, у меня будет таблица «Пользователи» и таблица «Заказы». Пользователи должны будут иметь отношение «один ко многим» к заказам. Проще говоря, заказ идентифицируется создавшим его пользователем. Так что это один ко многим, идентификация.
Это означает, что таблица «Заказы» будет иметь внешний ключ, такой как «Users_id».
Проблема возникает, когда вам нужно создать таблицу отношения «многие ко многим» между таблицами «Пицца» и «Заказы».
Эта таблица, назовем ее "Order_Details" (MySQL Workbench автоматически назвал ее "Orders_has_Pizzas"), должна ссылаться как на "Orders", так и на "Pizzas".
Теперь, поскольку «Заказы» уже ссылаются на таблицу «Пользователи» в идентифицирующем отношении, это часть первичного ключа «Заказы».
И давайте еще раз выясним это правило:
- «В таблице ссылок должен быть индекс, в котором столбцы внешнего ключа перечислены как первые столбцы в том же порядке».
Это означает, что вы должны ссылаться на весь первичный ключ. Если я удалю ключ «Order_Users_id», я получу ошибку 1005 при попытке создать базу данных.
Мой вопрос просто: есть ли способ обойти это? Потому что сейчас у меня есть этот идентификатор пользователя, упомянутый в 3 разных таблицах.
Или я неправильно это понимаю, и действительно ли это необходимо делать, чтобы не запрашивать разные таблицы для этих данных?
РЕДАКТИРОВАТЬ: люди, кажется, не согласны со мной в отношении идентификации между пользователями и заказами.
Я не понимаю, как можно идентифицировать отдельный заказ, не зная идентификатора пользователя. После того, как заказ сделан, кто-то должен будет доставить пиццу, а это значит, что ему нужно будет знать, куда ее доставить. Эти данные находятся в таблице Users. Таким образом, Users_id является частью идентификатора одного заказа.
Во всяком случае, так я это вижу. Если я ошибаюсь, объясните почему.
РЕДАКТИРОВАТЬ 2: Благодаря a_horse_with_no_name за разъяснение концепции «идентичности» с точки зрения баз данных, теперь я вижу ошибку своей логики. Информацию можно найти в комментариях.
Users_id
не должен быть частью первичного ключа вOrders
. - person SLaks   schedule 20.01.2014order id
, нет? Тогда в качестве идентификатора ПК необходим толькоorder id
. - person dani herrera   schedule 20.01.2014id
), поэтомуuser_id
не обязательно должен быть частью PK таблицыorders
. Это было бы необходимо только в том случае, если быorders.id
начиналось с 1 для каждого пользователя, например. id=1, user_id=1, id=2, user_id=1, id=1, user_id=2, ... - person a_horse_with_no_name   schedule 20.01.2014orders.id
является уникальным, этого достаточно, чтобы идентифицировать заказ. Пользователь, которому должен быть доставлен конкретный заказ, является атрибутом заказа, а не идентифицирующим ключом. Тот факт, что вы хотите ссылаться только наorders.id
в таблицеorders_has_pizza
, доказывает, чтоorders.id
уникален в вашей системе. - person a_horse_with_no_name   schedule 20.01.2014user_id
вorders_has_pizzas
, потому что вы получаете пользователя черезorders
. Вы могли бы денормализировать только в том случае, если у вас возникли проблемы с производительностью и вам нужно было ускорить определенные запросы. Таким образом,orders_has_pizzas
(или еще лучшеpizza_orders
) должны состоять только изorder_id
иpizza_id
. - person Raad   schedule 20.01.2014