2

ディスク、フォルダー、ファイル、リンクの 4 つのテーブルがあります。これは 4 種類のエンティティであり、属性の数と種類が異なるため、1 つの種類 (たとえば 1 つのテーブル) にマージすることはできません。そして関係があります:

  • ディスクには、フォルダ、ファイル、およびリンクを含めることができます。
  • フォルダには、フォルダ、ファイル、およびリンクも含めることができます。
  • ファイルとリンクには何も含めることはできません。

さらに、すべてのエンティティには、表示される順序があります (たとえば、アルファベット順などではなく、「ユーザー定義」)。これは実際の問題を単純化した例であり、実際にはもっと多くのエンティティがあり、関係はより複雑です。

では、テーブルの提案された構造は何ですか?

質問に答えてくれたみんなありがとう

4

4 に答える 4

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

ストアド プロシージャまたはトリガーに対して追加のチェックを実装する必要があります。

このようにして、階層を構築することができます (ディスクのすべてのサブフォルダーを見つけるなど)。

于 2010-01-15T12:00:16.950 に答える
0

実際には次のような 1 対多の関係です。

  • ADiskは 0 から多までFolderあり、aFolderはちょうど 1 に属しますDisk
  • AFolderは 0 から多までFileあり、aFileはちょうど 1 に属しますFolder
  • AFolderは 0 から多までLinkあり、aLinkはちょうど 1 に属しますFolder

えー図

ディスクテーブル

-- Disk
ID
Label
OrderNumber

すべてのフォルダ、ファイル、およびリンクを表すアイテム テーブル。

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

以下を持たないかどうかは、ビジネス ロジック次第です。

  • ファイルはファイルに属します
  • リンクはファイルに属します
  • フォルダはリンクに属します

.. 等々

于 2010-01-15T11:54:01.110 に答える
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はリレーションシップ内のリンクされたアイテムの序数を定義します。

于 2010-01-15T11:54:51.090 に答える
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
)

そんな感じ。

これにより、必要に応じてルール/リンクを簡単に拡張することもできます。

于 2010-01-15T11:55:06.970 に答える