2009-03-03 2 views
2

私は簡単な質問があります - "どちらか/または"データを格納するためのSQLテーブル設計のベストプラクティスがありますか?SQLテーブル - どちらか/またはデータのパターン

私は次のような問題があります。テンプレートデータ(フォルダ構造の定義)をSQLテーブルに格納する必要があります。任意のフォルダは静的な名前(「電子メール」など)を持つ場合もあれば、関連するオブジェクト(会社名など)に応じてインスタンスごとに動的に生成される場合もあります。

ビジネスオブジェクトがインスタンス化されると、テンプレートデータが実際のフォルダ構造の作成に使用されます。

私はこのようなデータを格納することを考えています:私はIsDynamicフィールドがtrueに設定されている場合

 
CREATE TABLE folder 
(
    ID INT IDENTITY PRIMARY KEY, 
    FolderName NVARCHAR(50), 
    IsDynamic BIT NOT NULL DEFAULT 0, 
    DynamicFieldID INT FOREIGN KEY REFERENCES dynamicField, 
    ParentID INT FOREIGN KEY REFERENCES folder 
) 

は、だから私は(外部キーに定義されている)のルールがあることを知っているが、そうでない場合はフォルダ名に格納されている値を使用します。

しかし、これはちょっと面倒なようです。このようなシナリオでは、「ベストプラクティス」パターンがありますか?

答えて

7

これはあまりにも悪くはありません。

DynamicFieldIDがnullであることから派生する「IsDynamic」フィールドを気にする必要はありません。あなたのSQLでは、LEFT JOINとCOALESCEフィールドをダイナミックテーブルから継承することができます。

しかし、私は上記のモデルがすべて厄介だとは思わない。

4
CREATE TABLE folder 
(
    ID INT IDENTITY PRIMARY KEY, 
    ParentID INT FOREIGN KEY REFERENCES folder 
) 

CREATE TABLE dynamic_folder (
    ID INT FOREIGN KEY REFERENCES folder (id), 
    DynamicFieldID INT FOREIGN KEY REFERENCES dynamicField 
) 

CREATE TABLE static_folder (
    ID INT FOREIGN KEY REFERENCES folder (id), 
    FolderName NVARCHAR(50) 
) 
+0

こんにちはパトリック - これに感謝。私はこれを検討していたが、これが私の場合より良かったか悪いかを判断するのに悩まされた。なぜこれがより良いのか(あるいは長所と短所とは何か)についてのあなたの意見は何ですか? – Chris

+0

2つ以上のタイプのフォルダがある場合、または2つ以上のカラムが影響を受けた場合、このアプローチは、すべてを1つのテーブルに保持しようとするよりもきれいになります。 しかし、私はChrisのCOALESE提案がより実用的だと思います。私は彼の答えを受け入れるだろう。 :-) –

-1

私は正確に質問を理解していますわからないが、私は何を言っていることは、あなたが他に基づいて、実行時に決定する必要がある静的な値または1のいずれかを有することができるフィールドを持っているということだと思います値。

私は独自の「可変」スキームを作成し、それをデータベースに格納します。私はどの言語を使っているのかわからないので、それに基づいて何かを考え出し(あなたの言語とは違うものを作る)、私は価値を取り巻く何かを使い始めると思います。ですから、例えば:

値:/ A社/ PROJECTA/

または

値/ @ companyVariable @/@ projectVariable @/

そしてちょうど開口部を探してルーチンを書き、看板@閉じますそれらを適切な値に置き換えます。それはもう少し作業ですが、最後に理解するのが最も簡単で、最も柔軟なものになると思います。繰り返しますが、@記号は、私が最初に考えたものです。どんな文字であれ、あなたに最も合ったものを使用してください。

+0

誰かが私が投票された理由についてコメントしていますか?私の答えは何らかの形で間違っていましたか?それが悪い考えであるならば、なぜか言及してください? –

1

あなただけDynamicFieldIDNULLを持つことができ、クエリそうのような:

SELECT COALESCE(dynamicName, folderName) 
FROM folder 
LEFT JOIN dynamicField ON (dynamicField.ID = folder.DynamicFieldID) 
関連する問題