У меня есть 3 таблицы: Книга, Раздел и Содержание. Я хочу добавить отношение «многие ко многим» между разделом и содержимым. В таблицах Section и Content есть столбец PageNo. Страница может иметь много содержимого и много разделов. Вкратце:
Book 1----* Section (on BookId)
Book 1----* Content (on BookId)
Section *-----* Content (on PageNo)
Номер страницы не уникален как для разделов, так и для таблиц содержимого. Поэтому я не могу добавить внешний ключ для PageNo в Sql Server.
Я попытался создать соединительную таблицу следующим образом:
SectionContent: [SectionId, ContentId]
И я добавил FK для этой соединительной таблицы. Таким образом, структура сущностей могла понимать соединительную таблицу и устанавливать отношения «многие ко многим» для SectionId и ContentId. Но каждый раз, когда мне нужно вставить один из разделов или таблиц содержимого, я также должен вставить в соединительную таблицу SectionContent. Итак, сначала я должен проверить, есть ли такая же запись в таблице соединений. Также в проекте много операций вставки. Мне нужно искать все операции вставки, и мне нужно добавить дополнительный запрос для вставки в соединительную таблицу.
Также мне нужно получить разделы и содержимое на странице. Это дополнительные усилия для меня.
Я могу удалить связь между таблицами Section и Content. И я могу использовать дополнительные запросы на соединение в столбце PageNo. Но я хочу использовать сущность. Я хочу получить содержимое таким же образом, как Section.Contents, и я хочу получить разделы так же, как Content.Sections.
Итак, могу ли я добавить связь «многие ко многим» между Section и Content в столбце PageNo без FK SQL Server?
Изменить: также, если я использую приведенную выше соединительную таблицу, я должен выполнить такой SQL-запрос, не так ли?
INSERT INTO SectionContent
SELECT * FROM
(
SELECT Section.id AS SectionId, Content.id AS ContentId
FROM Section
LEFT OUTER JOIN Content
ON Section.PageNo = Content.PageNo AND
Section.BookId = Content.BookId
UNION
SELECT Section.id AS SectionId, Content.id AS ContentId
FROM Section
RIGHT OUTER JOIN Content
ON Section.PageNo = Content.PageNo AND
Section.BookId = Content.BookId
) AS T
WHERE SectionId is not NULL AND ContentID is not NULL
GROUP BY T.SectionId, T.ContentId