Запрос дизайна базы данных - как мне объединить эти таблицы? - PullRequest
1 голос
/ 11 февраля 2010

У меня есть следующие таблицы в базе данных CMS (SQL Server 2008) для веб-сайта:

SiteMap       Page          Link
=========     =========     =========
SiteMapId     PageId        LinkId
LeftNode      Name          Name
RightNode     UrlId         Url
              -- etc --     -- etc --
  • Таблица Sitemap содержит иерархию веб-сайтов, использующую модель вложенного набора , используемую главным образом для создания навигации по веб-сайту.
  • Таблица страниц содержит данные для страниц, обслуживаемых системой CMS.
  • Таблица ссылок содержит URL-адреса, которые отображаются в навигации сайта, но не обслуживаются CMS (например, внешние ссылки на другие сайты).

Каждая строка SiteMap должна ссылаться на одну строку в таблице Page или в таблице ссылок, и в этом заключается проблема. Какой лучший способ?

  1. Добавление внешнего ключа SiteMapId к таблицам Page и Link - недостаток: позволяет ссылаться на одну и ту же строку SiteMap более чем одной записью (в обеих таблицах).
  2. Добавление столбцов PageId и LinkId в таблицу SiteMap - недостаток: один столбец будет избыточным, поскольку он всегда будет содержать ноль или 0.
  3. Добавьте столбец PageOrLinkId в таблицу SiteMap и столбец битового поля, чтобы пометить его как содержащий PageId или LinkId - недостаток: невозможно добавить ограничения к отношениям, чтобы они содержали действительные значения.

Может кто-нибудь предложить, что из вышеперечисленного мне следует использовать, или придумать лучший вариант? Спасибо.

Ответы [ 6 ]

1 голос
/ 11 февраля 2010

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

1 голос
/ 11 февраля 2010

Если каждая карта сайта может быть связана только с одной страницей или ссылкой, я бы выбрал первый вариант. В этом случае у вас не будет нулевых значений, как во втором варианте, и не будет ненужных столбцов, как в третьем варианте.

Получить все страницы (или ссылки) будет довольно просто, поскольку это просто простое внутреннее объединение.

0 голосов
/ 13 февраля 2010

В конце концов это было решено путем добавления ограничений непосредственно к первичным ключам, чтобы SiteMapId представлял собой автономный номер / идентификатор с отношениями один к одному с PageId и LinkId. Он не останавливает добавление как строки Page, так и строки Link для одной строки SiteMap, но позволяет избежать лишних столбцов или дополнительных таблиц.

0 голосов
/ 11 февраля 2010

Как насчет наличия таблицы с именем SiteItem с SiteMapID в ней и отношения 1-1 с таблицами Page и Link, то есть записи в таблице SiteItem, есть запись на странице или в таблице ссылок. В этом случае таблицы Page и Link похожи на подклассы таблицы SiteItem.

0 голосов
/ 11 февраля 2010

Еще одна возможность: добавить новую таблицу с SiteMapId, PageId и LinkId и добавить ограничения (((PageId НЕДЕЙСТВИТЕЛЕН ИЛИ LinkId НЕДЕЙСТВИТЕЛЕН), И (PageId НЕДЕЙСТВИТЕЛЕН ИЛИ НЕТ НЕДЕЙСТВИТЕЛЬНЫЙ))

После этого вы сможете присоединиться, используя новую таблицу, к двум другим таблицам ... только мои 30 секунд безумия. (* Тестировалось)

0 голосов
/ 11 февраля 2010

У вас может быть отношение многие ко многим, поддерживаемое этими таблицами, как еще один вариант:

SiteMapPage
SiteMapId
PageId

SiteMapLink
SiteMapId
LinkId

edit: но после размышления вряд ли будет полезнее, чем ваш вариант 1 ... извините!

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