2010-01-15 80 views
2

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

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

此外,所有实体都有显示它们的顺序(例如“用户定义的”,而不是按字母顺序排列的或别的东西)。这是一个实际问题的简单例子,实际上有更多的实体和关系更复杂。

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

谢谢大家谁回答这个问题

+0

看来你已经实际回答了你自己的问题。您遇到困难的多对多关系有任何方面吗? – 2010-01-15 11:53:11

+0

是的。可能至少有两个限制: - 父子限制:磁盘不能包含磁盘,链接和文件不能包含任何其他实体等 - 显示顺序限制:例如,一些文件夹和一些与一个磁盘文件不能有相同的显示顺序 所以,我想实现的数据库结构,这些限制是否有可能 – 2010-01-15 12:16:47

回答

0

这是actualy一个一对多的关系为:

  • 一个Disk有0到许多FolderFolder只能属于1 Disk
  • 一个Folder有0到很多FileFile完全属于1 Folder
  • A Folder有0到许多LinkLink只能属于1 Folder

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

磁盘表

-- Disk 
ID 
Label 
OrderNumber 

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

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

它是由你的业务逻辑不有:

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

。 。等等

+0

其实 - 磁盘有0到许多文件夹 - 磁盘有0到多个文件 - 磁盘有0到多个链接 - 文件夹有0到多个文件夹 - 文件夹有0到多个文件 - 文件夹有0到多个链接 在另一方面 - 文件夹只能属于1个磁盘或 - 文件夹只能属于1个文件夹 - 文件只能属于1磁盘或 - 文件只能属于1个文件夹 - 链接只能属于1磁盘或 - 链接完全属于1个文件夹 (!)所有实体都应该订购(在其父代的范围内) 所以,并不存在简单的一对多关系 – 2010-01-15 12:00:47

+0

所以你说'文件'和'链接'可以属于'disk'而不在'文件夹中?然后,较少混淆的解决方案是有一个“文件夹”调用** root **,将其视为特殊的“文件夹” – 2010-01-15 12:02:47

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

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 
) 

类似的东西。

这也很容易让你扩大规则/链接的要求。

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

您需要实现额外的检查将存储过程或触发器。

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