Отношения Many-many в базах данных RDBMS

Каков лучший способ обработать many-many отношения в базе данных RDBMS как MySQL?

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

  • Нормализация оставлена позади

  • Столбцы, который является пустым или пустым

Какой подход Вы проявили для поддержки many-many отношений?

5
задан bignose 29 July 2011 в 12:19
поделиться

3 ответа

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

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';
11
ответ дан 18 December 2019 в 10:43
поделиться

В дополнение к ответу Джастина: если вы умно используете ограничения внешнего ключа, вы можете контролировать, что происходит, когда данные обновляются или удаляются. Таким образом, вы можете быть уверены, что не получите ненормализованные данные.

1
ответ дан 18 December 2019 в 10:43
поделиться

Я бы использовал сводную таблицу, но я не понимаю, откуда у вас проблемы. Используя простой пример ученика / класса:

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 хранит информацию о курсе ... а сводная таблица просто содержит идентификаторы соответствующих студентов и курсов. Это не должно приводить к пустым / пустым столбцам или чему-то еще.

4
ответ дан 18 December 2019 в 10:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: