MySQL многие ко многим отношениям - PullRequest
3 голосов
/ 30 августа 2010

Читал учебное пособие Как работать с отношениями «многие ко многим» с PHP и MySQL .

В этом вопросе я ссылаюсь на раздел «Схема базы данных», в котором изложены следующие правила:

Эта новая таблица должна быть построена для разрешить следующее:

* It must have a column which links back to table 'A'.
* It must have a column which links back to table 'B'.
* It must allow no more than one row to exist for any combination of rows from table 'A' and table 'B'.
* It must have a primary key.

Теперь он кристально чистый.

Единственная проблема, с которой я сталкиваюсь, связана с третьим правилом («Оно должно позволять существовать не более одной строки для любой комбинации »).
Я хочу, чтобы это также применялось, но, похоже, это не сработает.

В моем тестовом экземпляре mysql (5.XX) я могу добавить две строки, которые отражают одинаковые отношения!

Например, если я сделаю это отношение (добавив строку):
от A до B
Это также позволяет мне сделать это отношение:
B до A

Итак, вопрос на самом деле состоит из двух вопросов:

1) Как мне сформулировать 3-е правило, которое не позволяет выполнять вышеуказанное ? Имейте только одно уникальное отношение независимо от комбинации.

2) Когда я захочу найти все отношения 'A', как будет выглядеть SQL-запрос ?

Примечание # 1: По сути, моя последняя цель - создать систему «дружбы», и, насколько я понимаю, решение - это таблица «многие ко многим». Предложите иначе, если это возможно.

Примечание # 2: Таблица пользователей находится в базе данных, отличной от отношений (назовите это дружескими отношениями) Таблица . Поэтому я не могу использовать внешние ключи.

Ответы [ 3 ]

2 голосов
/ 30 августа 2010

По первому вопросу:

  1. Создайте уникальное ограничение для обоих Столбцы
  2. Убедитесь, что вы всегда сортируете столбцы. Так что если ваш стол имеет colummns a и b чем убедитесь что a меньше или равно b

По второму вопросу:

SELECT
  *
FROM
  many_to_many_table
WHERE
  a = A or b = A
1 голос
/ 30 августа 2010

Звучит так, как будто вы хотите составной первичный ключ.

CREATE TABLE relationship (
     A_id INTEGER UNSIGNED NOT NULL,
     B_id INTEGER UNSIGNED NOT NULL,
     PRIMARY KEY (A_id, B_id)
);

Так вы настраиваете таблицу так, что в ней может быть только одна строка, которая определяет таблицы A и B как связанные,Это работает, потому что первичный ключ должен быть уникальным в таблице, поэтому в базе данных будет разрешена только одна строка с любой конкретной парой значений.Вы можете создавать составные ключи, которые не являются первичными ключами, и они не обязательно должны быть уникальными (но вы можете создать уникальный не первичный ключ, составной или нет), но ваша спецификация запросила первичный ключ, так что ярекомендуется.

Конечно, вы можете добавить другие столбцы для хранения информации об этом конкретном отношении.

0 голосов
/ 30 августа 2010

Хорошо WoLpH был быстрее, я в принципе согласен (обратите внимание, что вы должны создать ограничение single для обоих столбцов одновременно!). И просто чтобы объяснить, почему вы сталкиваетесь с упомянутыми вами правилами: как правило, A и B - это разные таблицы. Таким образом, типичный пример для отношений n: m допускает записи (1,0) и (0,1), потому что они будут ссылаться на разные пары. Наличие таблицы A = таблица B - это другая ситуация (вы используете A и B в качестве пользователей, но в примере это таблицы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...