Отношение многие ко многим для многих типов объектов - PullRequest
2 голосов
/ 15 января 2010

У меня есть четыре таблицы: диски, папки, файлы и ссылки. Это четыре типа объектов, и они не могут быть объединены в один тип (например, в одну таблицу), потому что они имеют различное количество и типы атрибутов. И есть отношения:

  • Диски могут содержать папки, файлы и ссылки;
  • Папки также могут содержать папки, файлы и ссылки;
  • Файлы и ссылки не могут содержать ничего.

Кроме того, все объекты имеют порядок, в котором они отображаются (например, «пользовательский», а не алфавитный или что-то еще). Это упрощенный пример реальной проблемы, в действительности сущностей гораздо больше, а отношения сложнее.

Итак, какова предлагаемая структура таблиц?

Спасибо всем, кто ответит на вопрос

Ответы [ 4 ]

1 голос
/ 15 января 2010

Я бы выбрал модель списка смежности с дополнительной проверкой ссылок:

CREATE TABLE inode (type INT NOT NULL, id INT NOT NULL, parent INT NOT NULL, order INT NOT NULL, PRIMARY KEY (type, id), CHECK (type IN (1, 2, 3, 4)))

CREATE TABLE disk (type INT NOT NULL, id INT NOT NULL PRIMARY KEY, disk_attributes ..., CHECK (type = 1), FOREIGN KEY (type, id) REFERENCES inode (type, id))

CREATE TABLE file (type INT NOT NULL, id INT NOT NULL PRIMARY KEY, file_attributes ..., CHECK (type = 2), FOREIGN KEY (type, id) REFERENCES inode (type, id))

CREATE TABLE link (type INT NOT NULL, id INT NOT NULL PRIMARY KEY, link_attributes ..., CHECK (type = 3), FOREIGN KEY (type, id) REFERENCES inode (type, id))

CREATE TABLE folder (type INT NOT NULL, id INT NOT NULL PRIMARY KEY, folder_attributes ..., CHECK (type = 4), FOREIGN KEY (type, id) REFERENCES inode (type, id))

Вам нужно будет выполнить дополнительную проверку хранимых процедур или триггеров.

Таким образом, вы сможете создавать иерархии (например, находить все подпапки диска) намного проще.

0 голосов
/ 15 января 2010

Использовать таблицы ссылок

CREATE TABLE Disk_Files 
(
    DiskID int
   ,FileID int
   ,SortOrder int
)

CREATE TABLE Disk_Folders 
(
    DiskID int
   ,FolderID int
   ,SortOrder int
)

CREATE TABLE Disk_Links 
(
    DiskID int
   ,LinkID int
   ,SortOrder int
)

CREATE TABLE Folder_Files
(
    FolderID int
   ,FileID int
   ,SortOrder int
)

CREATE TABLE Folder_Links
(
    FolderID int
   ,LinkID int
   ,SortOrder int
)

Во всех таблицах ссылок SortOrder определяет порядковый номер связанного элемента в отношении.

0 голосов
/ 15 января 2010

Я бы пошел с таблицей, которая определяет Правила , которая позволяет создавать ссылки, и порядок отображения для них.

DECLARE @Entity_Linkk_Rules TABLE(
        EntityFromType VARCHAR, --eg Disk
        EntitytoType VARCHAR, --eg Folder
        DisplayOrder INT
)

А затем у меня есть МногочисленныеМногие структуры ссылок, которые включают эти типы

DECLARE @Entity_Links TABLE(
        EntityFromType VARCHAR, 
        EntityFromID INT,
        EntityToType VARCHAR,
        EntityToID INT
)

Что-то в этом роде.

Это также легко позволит вам расширить правила / ссылки по мере необходимости.

0 голосов
/ 15 января 2010

Это действительно отношения один-ко-многим как:

  • A Disk имеет от 0 до многих Folder, а Folder принадлежит ровно 1 Disk
  • A Folder имеет от 0 до многих File, а File принадлежит ровно 1 Folder
  • A Folder имеет от 0 до многих Link, а Link принадлежит ровно 1 Folder

er схема http://bit.ly/4AKMXV

Таблица дисков

-- Disk
ID
Label
OrderNumber

Элемент Таблица, представляющая все папки, файлы и ссылки.

-- Item
ID
Label
ItemType COMMENT 'Folder|File|Link'
ParentId
OrderNumber

Ваша бизнес-логика не должна иметь:

  • Файл принадлежит файлу
  • Ссылка принадлежит файлу
  • Папка принадлежит ссылке

.. и т. Д.

...