2011-07-14 6 views
1

私はスーパーバイザのコミットメントを格納するデータベースを設計しようとしています。インターフェイスはWebブラウザを介して行われます。コミットメントデータベースのテーブルデザイン

問題は、スーパバイザごとに現在スプレッドシート内で異なるフィールドを追跡していることです。これは、各スーパーバイザのグループが異なるタイプの作業(コミットメント)を実行するためです。

すべてのフィールドを持つコミットメントテーブルを1つ作成し、これを使用してより多くのスーパーバイザーがフィールドを要求すると、新しいフィールドをタックし続ける必要がありますか?

また、コミットメントアイテムの内容を検討する必要がありますか?代わりにジェネリックコミットメントテーブルを作成し、ユニークフィールドを格納してジョインを使用するコミットメントの種類ごとにテーブルを作成しますか?これらの余分なテーブルは1つまたは2つのフィールドしか持たない。

3番目のオプションは、コミットの種類ごとに別々のテーブルを持ち、すべての共通フィールド(StartDate、EndDate、Description)を各テーブルで繰り返すことができます。

答えて

0

シナリオのコミットメントはほとんど半構造化/非構造化データです。それらをXMLとして保管したり、リレーショナル・データベースと一緒に実行されているネイティブXMLデータベースを使用したりすることを考えましたか?

eXistは、REST APIを備えたネイティブXMLデータベースで、コミットメントを簡単に照会してWebブラウザで表示することができます。

1

それが依存:約束は動的である場合は、監督者を意味する、新しいものを発明することができ、その後、私はこれに似たすべての異なる公約を含むコミットメントタイプテーブルを持つために行くだろう:

Table CommitmentType(Id, Description, ...) 

Table SupervisorCommitment(Id, CommitmentTypeId, SuperVisorId, StartDate, EndDate, ...) 

この方法で上司することができます新しいコミットメントタイプを追加することもできますが、それらを共有することもできます。

更新は:コミットメントも異なるフィールドを持っている場合、デザインのより多くの正規化されたバージョンはまた、フィールド関係テーブルにフィールドのいずれかCommitmentTypeを記述Fieldテーブルを持っているだろう(場合、それはMだ:N)またはコミットメント間でフィールドを共有したくない場合のフィールドテーブルのコミットメントタイプID。このように:

Table Field(Id, Name, TypeDescription, CommitmentTypeId) 

または

Table Field(Id, Name, TypeDescription) 
Table CommitmentTypeFields(FieldId, CommitmentTypeId) 

新しい契約及びコミットメントごとに新しいフィールドを作成することができますこの方法です。

MongoDbやCassandraのようなドキュメント指向のデータベースを使用して、データの格納方法をより柔軟にすることも考えられます。しかし、彼らはあなたが調査し、 "NoSQL"ワゴンに飛び乗る前に慎重に体重を測るべき他の不利な点があります。

アップデート2:また

Table CommitmentFieldValue(CommitmentTypeId, FieldId, Value) 

:値を格納することは、このようなCommitmentFieldValueテーブルに行くことができるあなたが新しいコミットメントタイプを作成するためにあなたのDB設計の自由度を持っているし、フィールドにはないという理由だけでそれをUIに公開する必要があることを意味します。

+0

スケーラビリティが望ましいので、新しいコミットメントタイプを追加することは良い考えです。しかし、新しいコミットメントタイプに関連する余分なフィールドはどこに行きますか?新しい約定タイプが契約Aの予算計画の完了を追跡する場合、その監督者は契約名、作成者および会計年度のフィールドを希望することがあります。他のスーパーバイザーは、ウィジェットの完了を追跡して、Part Name、Material type、Inspector First/Last Nameのフィールドを必要とする場合があります。 – jeff

+0

@jeff:答えを更新しました。 – ChrisWue

+0

@ChrisQue、私はあなたの応答をもう少し考えなくてはなりませんが、余分なフィールドのためにVALUEをどこに保存するかはまだ分かりません。特別なルックアップテーブルを作成するだけです。私はスケーラビリティーを求めていますが、必ずしもエンドユーザーが新しいコミットメントタイプを作成する必要はありません。私は仕事から外れます! – jeff

0

私の考えは、すべての共通データとコミットメントタイプフィールドを持つ汎用のコミットメントテーブルを持つことです。利点は、リストを表示しているときに、おそらくディテール表に参加する必要がないということです。

詳細を検索しているときに、正しいテーブルに参加することができます。キー/値テーブルに詳細があるような柔軟な処理も可能です。詳細フィールドのタイプと値の両方が格納されているので、新しいフィールドを追加するのが非常に簡単です。

+0

はい私はジェネリックコミットメントテーブルを持つことに同意します。私の唯一の関心事は、追加のディテールテーブルが1つまたは2つのフィールドしか持たないことでした。私はキー/バリューテーブルのアイデアが気に入らない。私はそのアプローチについて良いことと悪いことを読んだ。 – jeff

+0

ええ、私はKey/Valueアプローチを使用しましたが、それは痛みですが、時には最適な解決策です。不愉快なことは、KeyテーブルとKeyIDと値を含む各行を持つValuesテーブルがあるはずです。早く手早くなる。個人的には、エンドユーザーにフィールドを追加する権限を与えたい場合にのみ、そのルートを選択します。 –

0

基本的な質問は、「データベースを使用して多形データを保存するにはどうすればよいですか?共通の列、バリアントごとに1つのテーブル(SQL)と

  • シングルテーブルのすべての可能な列(SQL)と
  • つのテーブル:これまでのところ、あなたは私の知る可能なすべての答えを持っていましたバリアントごと
  • 一つのテーブル(SQL)
  • エンティティ/属性/値(SQL)
  • ドキュメント(のNoSQL)

適切なソリューションを選択するには、私はconsideをお勧めしますデザインでサポートしなければならない種類のクエリを呼び出し、使用可能な各モデルでこれらのクエリをどのように記述するかを検討します。

"期限切れのコミットメントを持つすべての監督者を見つける"、 "タイプ別にすべての期限切れのコミットメントを見つける"、 "コミットメントのない監督者を探す"、 "ビジネス全体にどれくらいのコミットメントがあるのか​​、タイプ別にグループ化されていますか? "あなたがそれらに答えるかもしれないか考えてみてください。おそらく、デベロッパーボックスで何かを嘲笑してください。

最終的には、将来の柔軟性と今日の開発の容易さとスピードのトレードオフを考慮する必要があります。

関連する問題