Каков лучший способ обработать many-many отношения в базе данных RDBMS как MySQL?
Попытались использовать сводную таблицу для отслеживания отношения, но она приводит к любой следующего:
Нормализация оставлена позади
Столбцы, который является пустым или пустым
Какой подход Вы проявили для поддержки many-many отношений?
Следите за отношением «многие ко многим» в таблице специально для этого отношения (иногда называемой таблицей соединений ). Эта таблица моделирует отношения как два отношения «один ко многим», указывающие в противоположных направлениях.
CREATE TABLE customer (
customer_id VARCHAR NOT NULL,
name VARCHAR NOT NULL,
PRIMARY KEY (customer_id));
CREATE TABLE publication (
issn VARCHAR NOT NULL,
name VARCHAR NOT NULL,
PRIMARY KEY (issn));
-- Many-to-many relationship for subscriptions.
CREATE TABLE subscription (
customer_id VARCHAR NOT NULL,
FOREIGN KEY customer_id REFERENCES customer (customer_id),
issn VARCHAR NOT NULL,
FOREIGN KEY issn REFERENCES publication (issn),
begin TIMESTAMP NOT NULL,
PRIMARY KEY (customer_id, issn));
Затем вы используете соединительную таблицу для соединения с ней других таблиц через внешние ключи.
-- Which customers subscribe to publications named 'Your Garden Gnome'?
SELECT customer.*
FROM customer
JOIN subscription
ON subscription.customer_id = customer.customer_id
JOIN publication
ON subscription.issn = publication.issn
WHERE
publication.name = 'Your Garden Gnome';
-- Which publications do customers named 'Fred Nurk' subscribe to?
SELECT publication.*
FROM publication
JOIN subscription
ON subscription.issn = publication.issn
JOIN customer
ON subscription.customer_id = customer.customer_id
WHERE
customer.name = 'Fred Nurk';
В дополнение к ответу Джастина: если вы умно используете ограничения внешнего ключа, вы можете контролировать, что происходит, когда данные обновляются или удаляются. Таким образом, вы можете быть уверены, что не получите ненормализованные данные.
Я бы использовал сводную таблицу, но я не понимаю, откуда у вас проблемы. Используя простой пример ученика / класса:
Student
-------
Id (Primary Key)
FirstName
LastName
Course
------
Id (Primary Key)
Title
StudentCourse
-------------
StudentId (Foreign Key -> Student)
CourseId (Foreign Key -> Course)
Или, как кто-то другой упомянул в ответ на ваш вопрос ученика / учителя / курса (в котором будет дополнительная таблица для хранения типа человека в курсе):
PersonType
----------
Id (Primary Key)
Type
Person
------
Id (Primary Key)
FirstName
LastName
Type (Foreign Key -> PersonType)
Course
------
Id (Primary Key)
Title
PersonCourse
------------
PersonId (Foreign Key -> Person)
CourseId (Foreign Key -> Course)
Студент таблица содержит информацию о студентах, таблица Course хранит информацию о курсе ... а сводная таблица просто содержит идентификаторы соответствующих студентов и курсов. Это не должно приводить к пустым / пустым столбцам или чему-то еще.