2012-02-21 3 views
2

Я стараюсь полностью понять отношения и прошел много учебников. Тем не менее я задерживаться на несколько вещей (используя MySQLWORKBENCH): enter image description here 1. Каждый пользователь может загрузить продукт 2. Каждый продукт может иметь несколько категорий, ставки, рейтинги и т.д. 3. Каждый пользователь может иметь несколько номера телефонов (там больше, но это базовая настройка)Моделирование отношения MYSQL: дизайн и UPDATE/DELETE

правильно ли это ?: 1 - я использовал 1: п отношения, так как каждый пользователь может загрузить несколько продуктов. 2 и 3. Я использовал п: т отношения, так как там может быть несколько продуктов с несколькими категориями, предложения, отзывы и т.д.

DELETE/UPDATE: я использовал ON UPDATE CASCADE и ON DELETE CASCADE везде, где есть внешний ключ ... это «продукт», «category_tags_has_products», «bid_price_has_product», «phone_has_user».

Я попытался удалить такой продукт (php): mysql_query ("DELETE FROM product WHERE id = '$ id'"); Я получаю ошибку 1054, которая является ошибкой внешнего ключа. Каковы лучшие практики здесь? Насколько я понимаю, мне не нужно делать удаления ни в чем другом, кроме родительского стола?

Thanx!

ответ

1

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

С этой целью я изменил бы ссылку на пользовательский продукт, чтобы не идентифицировать, что сделает user_id внешним ключом, а не частью Первичного ключа. В workbench ярлык для неидентифицирующего отношения 1: n является ключом «2» (где как «4» идентифицируется). Это, в свою очередь, должно удалить поля user_id из таблиц, на которые ссылаются продукты.

Когда вы удаляете продукт, он должен каскадировать до 3 таблиц ссылок, к которым он привязан. В настоящее время может быть, что он пытается удалить от пользователей также в зависимости от того, как настроен FK. Следующее должно быть cascade deletions (при условии, что удаление является постоянным, и вы просто хотите очистить все связанные записи)

DELETE FROM product -> удаляет из любой таблицы с помощью product_id в УДАЛИТЬ ИЗ пользователя -> удаляет из любой таблицы с помощью user_id в

То же самое касается телефона, рейтинга, bid_price, category_tags.

Надеюсь, это будет полезно, если вам нужны дальнейшие указатели, вы можете кричать :)

+0

Изменен пользовательский код продукта для неидентификации. – user1163859

+0

Я удаляю вот так: $ query = "DELETE FROM product WHERE id = '$ id'"; var_dump ($ query); mysql_query ($ query); – user1163859

+0

$ id = product_id – user1163859

1

Отношения выглядят правильно. Чтобы узнать, что не так с вашим запросом, проверьте переменную $id. Или проверить весь запрос, а затем запустить его в консоли/PhpMyAdmin/и т.д.:

$query = "DELETE FROM product WHERE id='$id'"; 
var_dump($query); 
mysql_query($query); 

P.S .: и не забывайте экранировать все данные, полученные от пользователей! Например:

$id = mysql_real_escape_string($_GET['id']); 
+0

Спасибо. Но это все еще не работает.Я попытался удалить с помощью phpmyadmin, но я получаю эту ошибку: – user1163859

+0

# 1451 - Не удается удалить или обновить родительскую строку: ограничение внешнего ключа завершается с ошибкой ('databasename'.'category_tags_has_product', CONSTRAINT' fk_category_tags_has_product_product1' FOREIGN KEY ('product_id',' product_user_id') ССЫЛКИ 'product' (' id', 'user_id') ON DELETE NO AC) – user1163859

+0

Поместите' ON UPDATE CASCADE' и 'ON DELETE CASCADE' на' category_tags_has_product.product_id'. В настоящее время у вас нет действий для 'ON DELETE', и когда вы пытаетесь удалить продукт из таблицы' product', соответствующие записи остаются в таблице 'category_tags_has_product', и вы получаете ошибку, потому что запись в' category_tags_has_product' пытается указать удаленную строку в таблице 'product'. – Minras

Смежные вопросы