许多类型实体的多对多关系

时间:2010-01-15 11:48:59

标签: database many-to-many relationship entities

我有四个表:磁盘,文件夹,文件和链接。它是四种类型的实体,并且它们不能合并为一种类型(例如,合并到一个表中),因为它们具有不同数量和类型的属性。并且存在关系:

  • 磁盘可以包含文件夹,文件和链接;
  • 文件夹也可以包含文件夹,文件和链接;
  • 文件和链接不能包含任何内容。

此外,所有实体都具有显示它们的顺序(例如“用户定义”,而不是字母或其他内容)。它是实际问题的简化示例,实际上有更多的实体和关系更复杂。

那么,建议的表结构是什么?

感谢所有回答问题的人

4 个答案:

答案 0 :(得分:1)

我会选择邻接列表模型并附加检查参考:

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))

您需要对存储过程或触发器实施其他检查。

这样,您就可以更轻松地构建层次结构(比如,查找磁盘的所有子文件夹)。

答案 1 :(得分:0)

这实际上是一对多的关系:

  • Disk有0到多个Folder,而Folder只属于1 Disk
  • Folder有0到多个File,而File只属于1 Folder
  • Folder有0到多个Link,而Link只属于1 Folder

er diagram http://bit.ly/4AKMXV

磁盘表

-- Disk
ID
Label
OrderNumber

表示所有文件夹,文件和链接的项目表。

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

由您的业务逻辑决定:

  • 文件属于文件
  • 链接属于文件
  • 文件夹属于Link

..等等

答案 2 :(得分:0)

使用链接表

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 定义关系中链接项的序号位置。

答案 3 :(得分:0)

我会选择一个定义规则的表格,它允许制作链接,以及这些链接的显示顺序。

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
)

类似的东西。

这也可以让您轻松扩展规则/链接。