web-dev-qa-db-ja.com

データベース計画...並列フィールドの回避

これが私の最初の投稿です。

私はプログラマーで、最近データベースに興味を持っています。私はサイドプロジェクトに取り組んでおり、データベースを最適に構築する方法としていくつかのヒントが必要です。

シナリオは次のとおりです。「六次の隔たり」理論がソーシャルメディアでどのように維持されているかを確認しようとしています。 Webクローラーとほぼ同じように機能するスクリプト化されたソーシャルメディアアカウントを作成します...ソーシャルメディアアカウントにアクセスし、すべてのUserIDとUserNameをデータベースファイルにカタログします。UserIDが主キーとして機能します。どのユーザーIDがどのアカウントにリンクされているかを追跡するテーブル(またはテーブルのコレクション)が欲しいのですが...つまり、ユーザーID 12345のページには、ユーザーIDの44444および55555との間のリンクがあります。

問題は、私のデータベースクラスで、複数の属性を保持する並列フィールドまたは列を持つことは悪い習慣であると言われていることです。これは避けたいと思います。

私が説明したことから、UserID 12345は、1つの列(44444と55555)に2つのエントリがあるか、それぞれ1つのuserIDを保持する2つの並列フィールドがあります。これを回避するための最良の方法は何ですか?

2
james reeves

リレーショナルDBテーブルの1つの行には、1つのファクトのみが含まれます。そのユーザー12345はユーザー44444に接続されており、ユーザー55555には2つの事実があります。したがって、2つの別々の行として格納する必要があります。

列は、現実の世界からの意味をキャプチャします。テーブルによっては、列間に暗黙のセマンティクスが存在する場合があります。良い例は、部門のレポート階層です。通常、これはモデル化されます。

Employees
   EmployeeID
   Name
   HiredDate
   ManagerID Foreign Key references Employees.EmployeeID

各マネージャーは従業員でもありますが(データ用の行がテーブルにあります)、特定の行について、EmployeeID列とManagerID列の値を交換することは意味がありません。この2つは対称的ではなく、列に意味があります。

ただし、あなたの例では、AがBの友達である場合、BはAの友達です。ペアリングは完全に対称です。これをRDBMSでモデル化すると、前述の暗黙の非対称性が解消されるため、問題が発生する可能性があります。 RDBMSでこれを行うための手法があります。 1つの方法は、各ペアを2回、つまり12345/44444と44444/12345に保存することです。もう1つは、テーブルを2回クエリし、クエリ間で列に割り当てられた意味を交換することです。

これは理解するのが難しい場合があり、リレーショナルデータベース設計への最初の旅としては非常に難しい可能性があります。

4
Michael Green