2

まず、これはリレーショナルデータベースに継承を実装する方法についての質問ではありません。

問題:

私はいくつかの他のサブシステムなどを持っているかもしれないいくつかのサブシステムを持っているシステムを持っています。各システムの構成パラメーターを格納するデータベースを作成する必要があります。子システムは、独自の設定が提供されていない場合、親から設定を継承します。継承は各パラメーターに基づいており、その完全なセットではありません。

基本的に...

保存時:

  • システムA:背景:白、スタックサイズ:100、スレッド:50
    • システムA-1:背景:青、スタックサイズ:null、スレッド:null
      • システムA-1-1:バックグラウンド:null、スタックサイズ:10、スレッド:null
    • システムA-2:バックグラウンド:null、スタックサイズ:null、スレッド:150

ロード時:

  • システムA:背景:白、スタックサイズ:100、スレッド:50
    • システムA-1:背景:青、スタックサイズ:100、スレッド:50
      • システムA-1-1:背景:青、スタックサイズ:10、スレッド:50
    • システムA-2:背景:白、スタックサイズ:100、スレッド:150

これをどのように実装しますか?そうすれば、高速にロードすることもできますか?

私はNoSqlとSqlソリューションのいずれかを使用するために開いています。しかし、これを消費する私のアプリケーションはC#で記述されます。

前もって感謝します。

4

1 に答える 1

1

以前(MS Sql Serverで)自己参照構成テーブルを使用して、これに似たものを実装しました。各エントリは、システム、親システム、および設定名/値を指定します。これにより、(背景用の列、スレッド用の列などではなく)保存する設定を柔軟に設定できます。レベルの数が最大再帰深度を超えない限り、再帰CTEを使用して特定のシステムの設定を計算できます。開始する場所として:

CREATE TABLE Configuration (
    SystemId varchar(30), 
    ParentSystemId varchar(30), 
    Name varchar(30), 
    Value varchar(30)
)

また、システムの構成を取得するには、次のようにします。

;WITH SystemConfig (Id, ParentId, Name, Value, Rank) AS (
    SELECT SystemId, ParentSystemId, Name, Value, 1
    FROM Configuration C
    WHERE SystemId = @SystemId

    UNION ALL

    SELECT D.SystemId, D.ParentSystemId, D.Name, D.Value, Rank + 1
    FROM Configuration D
    INNER JOIN SystemConfig S ON S.ParentId = D.SystemId
)

SELECT DISTINCT K.Name, V.Value 
FROM SystemConfig K
CROSS APPLY (
    SELECT TOP 1 Value
    FROM SystemConfig G
    WHERE K.Name = G.Name
    ORDER BY Rank
) V

デモSQLフィドル

これがSQLで最も効率的な方法であるかどうかはわかりません。また、NoSqlソリューションを試したことはありませんが、これで作業は完了し、適切なインデックス作成でうまく機能します。

于 2012-07-26T17:14:44.263 に答える