1

次のシナリオで DB を設計する最善の方法についてアドバイスが必要です。

以下のDB構造の例に従ってください(問題を説明するだけでは現実的ではありません)

File
(
  Id INT PRIMARY KEY...,
  Name VARCHAR(), 
  TypeId SMALLINT, 
  ...
  /*other common fields*/
)
FileContent
(
  Id INT PRIMARY KEY...,
  FileId FOREIGN KEY REFERENCES File(Id) NOT NULL ON DELETE CASCADE UNIQUE,
  Content VARBINARY(MAX) NOT NULL, 
)

Book 
(
   Id INT PRIMARY KEY..., 
   Name VARCHAR(255), 
   Author VARCHAR(255)
   ...
   CoverImageId FK REFERENCES File(Id),
)

BookPageType
(
   Id TINYINT PRIMARY KEY..., 
   Name VARCHAR(50), 
)

BookPage
(
   Id INT PRIMARY KEY..., 
   TypyId TINYINT FOREIGN KEY REFERENCES BookPageType(Id), 
   BookId INT FOREIGN KEY REFERENCES Book(Id) ON DELETE CASCADE,
   Name VARCHAR(100),
   CreatedDate DATETIME2,
   ... 
   /*other common fields*/  
)

BookPage1
(
  Id PRIMARAY KEY REFERENCES BookPage(Id) NOT NULL  ON DELETE CASCADE, 
  FileId PRIMARAY KEY REFERENCES File(Id)
  ... 
  /* other specific fileds */
)
...
BookPageN
(
  Id PRIMARAY KEY REFERENCES BookPage(Id) NOT NULL ON DELETE CASCADE, 
  ImageId PRIMARAY KEY REFERENCES File(Id),
  ... 
  /* other specific fileds */
)

ここで質問は、すべてのページとデータを含む本を削除したい (カスケード削除でうまく機能する) ことですが、カスケードで関連ファイルも削除する方法 (1 対 1 の関係) です。ここでは、次のアプローチを参照してください。

  1. 使用時にすべてのテーブルにファイルを追加しますが、すべてのテーブルのファイル スキーマをコピーしたくありません
  2. 外部キーをファイル テーブルに追加します (たとえば、ページの代わりに)。ただし、たとえば 10 個のテーブルでファイルを使用するため、ファイル テーブルに 10 個の外部キーがあります。これもダメ
  3. トリガーを使用して、やりたくないこと

前もって感謝します

4

2 に答える 2

0

BookPageしたがって、定義したのはとの間の多対多の関係Fileです。これは、 と の間の 1 対多の関係BookPageと、との間BookPageNの 1 対多の関係の結果です。テキストで必要な関係を得るには、関係を方向転換してから を指すようにする必要があります。おそらく、非常に多くのテーブルを用意する代わりに、それらを 1 つのテーブルに統合する方法を見つけることができます。たぶん、テーブルを使用するだけです。オプションのフィールドに null を許可するだけです。FileBookPageNBookPageNFileBookPageNBookPage

于 2013-09-26T13:31:51.120 に答える
0

そのような必要がある場合は、ベースをリファクタリングする必要があるようです。この例は現実的ではないとおっしゃいましたが、奇妙ですが、ページの N テーブルについては質問しません。すべてのファイルが 1 対 1 の関係にあるとは限らず、他の本が参照していないファイルだけを削除する必要がある場合、それはトリガーの仕事のように聞こえます。

于 2013-09-26T13:24:26.543 に答える