web-dev-qa-db-ja.com

異なるエンティティを単一のテーブルにリンクする最良の方法

私は公職に立候補しています。自宅の有権者のドアノックを追跡するためのWebアプリを作成しました。データベースにはvotersというテーブルが含まれています。このテーブルには、私のコミュニティの有権者に関する必要な情報がすべて含まれています。 mysqlを使用しています。

キャンペーンの寄付者を追跡するための新機能を追加したいのですが。これらの寄付者全員がコミュニティに住んでいるわけではなく、私が選挙に立候補している地区に投票しません。これらの個人について、有権者の場合と同じ種類の情報を追跡する必要はないので、これらの個人をnonvoters.というテーブルに配置します。

これで、votersテーブルの個人も寄付を行うことができます。寄付も追跡したいと思います。

最後に、組織からの寄付も追跡したいので、組織に関する情報を格納するためのorganizationsテーブルも必要です。

有権者、非投票者、組織の両方からの寄付を追跡するために、donations.という新しいテーブルを設定します。このテーブルには、各寄付に関する適切な詳細が含まれます。

しかし、donationsテーブルをvotersnonvoters、およびorganizationsテーブルにリンクするための最適な構造はどのようなものであるかについては、私にはわかりません。テーブルにdonor_idという列を作成して、寄付者情報にキーを付けると、IDがどのテーブルを参照しているかを知る方法がありません。それで、nonvoter_idvoter_idorg_idの3つの列を設定し、寄付者が有権者かどうかに応じて、該当する列にIDを挿入しますか?これは奇妙なようです。

または、donor_idという3つのテーブルのそれぞれに新しい列を作成して、データを寄付テーブルにリンクすることができます。このルートを使用した場合、donor_idが一意であり、donationsテーブル内のデータにキー設定されていることを確認するために、裏でいくつかの作業を行う必要があるようです。

あるいは、私がよく知らない他のアプローチがあるかもしれません。どんなガイダンスもありがたいです。

5
StevieD

すばらしい質問です。 barker-ellis notation スタイルでスーパー/サブタイピングを使用するアプローチを次に示します。このアプローチでは、スーパータイプとサブタイプは、特定のエンティティタイプのすべてのエンティティが持つ単一の変化しない基本的な特性に基づいて分類するためにのみ使用されます。これは、生物の taxonomy に似ています。このスタイルを使用すると、サブタイプは、あなたがプレイしたロールではなく、あなたがareに基づいてサブタイプのみになります。

enter image description here

この例では、個人または組織のいずれかであるパー​​ティーを識別します。これは、エンティティが単一の個人または個人のグループである場合、単一の基本的な不変の特性に基づいています。人は寄付をすることができます。組織は寄付をすることができます。人は投票することができます。組織はnever投票できます。これらのものは決して変わらない。

投票に関しては、有権者であるか非有権者であるかに基づいてPersonをサブタイプすることは理にかなっているように見えるかもしれません。しかし、有権者または非有権者であることは何もない誰と関係があるかisです。代わりに、それは彼らがliveである地区と関係があります。したがって、地区エンティティタイプをモデル化します。これはの家 1人以上の場合があります。同様に、人は居住地が1つだけの地区でなければなりません。

このアプローチは、有権者または非有権者を宣言することによって発明した情報の代わりに、自然に発生する情報-人が存在する場所-を通じて、誰が寄付をしたのか、誰が有権者であるのかを知る必要性を解決します-または両方とも。 両方有権者または非投票者である人に関して、それは誤解を招くものです。それらは両方ともover時間になる可能性がありますが、moment in時間になることはありません。したがって、あなたは彼らの居住の歴史を気にするかどうかを決める必要があります。その場合は、代わりにエンティティタイプを作成して(居住地など)、その人物が居住している期間、居住している地区にその人物を関連付けます。しかし、あなたは気にしていないのではないかと思うので、その人の情報を更新して新しい地区を表示するだけです。どちらの方法でも、アプローチはサブタイピングを使用するよりも直感的です。これが、私がスーパータイピングとサブタイピングを基本的な分類のみに制限するbarker-ellisアプローチを好む理由です。

不足している情報の処理

ただし、専門化が理にかなっている場合は1つ残っています。あなたは、彼らがあなたの地区に住んでいるため、あなたに賛成または反対することができる場合、その人について保存する追加情報があると言います。このアプローチでは、情報は人がどこに住んでいるかに関係なく、その人の特徴であると述べました。 collect彼らがあなたの地区に住んでいない場合はそれを、そうでない場合は収集することを選択しているだけです。したがって、地区に住んでいない人の場合、この情報はmissingになります。

これには2つの方法があります。最初に、単純に個人の属性を含めて、それらを欠落させることができます。 mySQLでは、列をNULLABLEにします。そのアプローチは簡単ですが、ever述語としてこれらの属性の1つを使用するクエリを記述したい場合、 つの値のロジック(3VL)の複雑さに対処する必要があります。 、およびSQLがその3VLを一貫して実装していないという事実。代わりに3VLを避けたい場合は、特殊化を使用して追加のエンティティタイプを作成し、既知の場合にのみ追加情報を保持できます。データを収集した人のみの行がそこに配置されます。これで、外部結合を処理する必要があるため、これはNULLを完全に回避しませんが、cancoalesceを使用して選択した場合、NULLを回避します。

スペシャライゼーションの命名

notを呼び出して新しい特殊化エンティティタイプvoterを呼び出します。あなたの地区に住んでいて投票できる人のためだけに必要な情報なので、現時点では追加情報を収集していません。今後、あなたがdo他の理由でその情報を収集したい場合はどうなりますか?とにかく、地区に住んでおらず、ただ投げ捨てたくない人のために、その情報を知っていたらどうでしょうか。あなたが情報を収集した誰かがあなたの地区から引っ越した場合、あなたはどうしますか? 削除収集した良い情報を使いますか?もしそうなら、彼らが戻ってきたらどうなりますか?あなたはそれを再び収集する必要があります!

代わりに、テーブルをvoter profileのような少し異なる名前で呼び出します。これは、有権者としての人物に関連する情報を示し、その情報は、彼らについての追加事項を絶対的に説明しますregardless彼らがあなたの地区に住んでいるかどうか。

結論

このアプローチがあなたのためにいくつかの追加の食べ物を与えることを願っています。ビジネスモデリングへのbarker-ellisアプローチの詳細については、 David Hay 's Enterprise Model Patterns と、Richard Barkerの CASE * Method Entityも参照してください。関係モデリング 。欠落している情報に関しては、Fabian Pascalの論文「The Final Null in the Coffin」、彼の優れた Practical Database Foundation Series の一部、および日付とダーウェンの The 3番目のマニフェスト nullなしで欠落している情報を処理するためのさまざまなアプローチに関するいくつかの優れたリソースがあるサイト。

2
Todd Everett