0

私はデータベースの設計を開発する準備段階にあります。

これが私のジレンマです。現在、データベース内に入力する必要のある約150以上のフィールドの概要を説明しましたが、通常の正規化ルールに従って、フィールドをリンクされた有効なテーブルに分割する方法を決定するのに苦労しています。

私が一人の兵士について収集している情報の抜粋をあなたに与えるためだけに:

  • 個人情報(氏名、行政番号、宗教、出生地、近親者など)
  • 家族(親、子供、兄弟)
  • 学歴(学校を卒業した年齢、最高学年に達した、大学/大学、貿易/見習い、話された/書かれた言語など)
  • 職歴(過去の職歴、雇用主の氏名、特定の職業、退院後の保証された仕事、農業経験など)
  • 病歴(年齢、目/髪の色、身長、体重、顔色、傷跡、視力、聴覚など)
  • 健康診断(骨折歴、以前の頭部外傷-脊髄のトラブル-破裂-結核-喘息、血圧、他の多くの状態など)
  • 連隊の歴史(入隊日、入隊時の連隊、参加した他の連隊、最高ランクなど)
  • 兵士の場所(兵士が生まれ、入隊、訓練、戦場、死から来たすべての重要な場所のリスト)
  • 埋葬情報(死亡日、死亡場所、墓地、墓地など)

明らかに、1人の兵士について収集する必要のある情報がたくさんあります。私の問題は、管理しやすく効率的な方法でテーブルを分割する方法と、それぞれにリストする必要のある主キー/外部キーを決定しようとしていることです。

  1. 各列が兵士になる巨大なテーブルが1つあると考えるのは非論理的です。
  2. ロジスティック的には、データベースを上記のようにテーブルに分割する必要があるかもしれませんが、各行でほぼ同じsoldierIDになるため、主キーに何を使用すればよいかわかりません。これにより、テーブルが相互に接続されます( #1と同じではないので、私には正しくないようです?)
  3. データベースを、相互に指す非常に単純なテーブル(つまり、テーブルごとに2つの列)に分割します。例:Language_Tableには、それぞれが一意のIDで話されたり書かれたりする可能性のあるすべての言語のリストがあります。これは最も理にかなっているように見えますが、膨大な数のテーブルを作成します。

計画では、Azureでデータベースをホストし、最終的にWindowsPhoneアプリにフィードする予定です。

4

3 に答える 3

1

カーブボールをあまり投げたくないが、代わりにRavenDbのようなドキュメントデータベースを使用することを検討しましたか?すべてが1人の兵士に関連しているため、このすべての情報を1つのドキュメントに簡単に保持できるため、関連するテーブルに分割しようとするのはかなり恣意的です。これはすべて兵士に関連するメタデータなので、1人の兵士のレコードに対して一緒に保存します。

最初のステップとして、質問で詳しく説明されているように、ソリダーについて記録したいデータを正確にマッピングするためのドメインモデルの設計に集中します。それが済んだら、選択したデータストアにマップする方法を考えてください。

于 2013-03-26T16:04:59.287 に答える
1

あなたがしたいのは、兵士の情報を正規化することです。私がリンクしたウィキペディアの記事を読むことは、私が提供できるように簡潔な説明についてです。データ項目の関係を正規化することにより、この情報をリレーショナルデータベースに保存できます。

ソルジャーテーブルから始めましょう。通常、テーブル名は単数形で、大文字で始まります。このテーブルには、兵士がこのアイテムを1回だけ出現したすべてのアイテムを配置します。

この基準に適合する項目には、名前、出生地、生年月日、死亡日、死亡場所、埋葬地などがあります。

このテーブルには、必要な数のアイテム(列)を含めることができます。唯一の基準は、各アイテムが1回発生することです。

それで、兵士が複数の何かを持っているとどうなりますか?

例として家族を取り上げましょう。FamilyMemberテーブルは次のようになります。

FamilyMember
------------
FamilyMemberID
SoldierID
FamilyMemberType
FamilyMemberName
...

FamilyMemberIDは、FamilyMemberテーブルのプライマリ(クラスタリング)キーです。これは、テーブルに一意のキーを提供する自動インクリメントの整数または長整数です。

SoldierIDは、Soldierテーブルに戻る外部キーです。

FamilyMemberTypeは、家族と兵士の関係を記述します。いくつかの例は、親、兄弟、姉妹などです。通常、テキストではなく、コード(Pは親、Bは兄弟、Sは姉妹)を保存します。

残りの列は、家族のメンバーについて説明しています。これらの列は、家族の一員の唯一の出現を表しています。

これは、リレーショナルデータベースに保存するすべてのデータ項目に対して行います。

すべてのアイテムについて、兵士とこのアイテムの関係は何ですか?

もう1つの例を挙げると、連隊を見てみましょう。兵士と連隊の関係は何ですか?兵士は1つまたは複数の連隊に所属できます。

したがって、RegimentテーブルはFamilyMemberテーブルと同様に構造化されます。

于 2013-03-26T16:17:14.107 に答える
0

私はあなたにヒントを与えることができるかもしれません...与えられたコメントはあなたにとってそれほど悪くないかもしれませんが、あなたは実際のデータベースを作成することも決定できます。問題は、情報が特に兵士に関係していることです...それでも、自給自足の情報を見ることができれば、情報を切り取ることができます(仕様を読むことから進化する可能性のあるオブジェクトを見つけようとする場合のように)。

あなたのデータベースにはかなりの数の参照テーブルがあります...私はあなたに例をあげます:

今日知られているすべての宗教とこのテーブルから兵士テーブルへのリンクを含む宗教テーブル。(良いことは、兵士のテーブルでは、クリスチャンは常にクリスチャンであり、一度はクリスチャン、クリスチャン、クリスチャンではないということです。)

次に、この特定のオブジェクトを見つける必要があります:例:WORK

従業員の名前、開始日、終了日などの作業テーブルを追加できます。

または医療ファイル:診察日、病院(ちなみに参照)、身長、体重、...

そんな感じ

于 2013-03-26T16:23:07.377 に答える