2

私のデータベースには、組織テーブルと住所テーブルがあります。アドレス テーブルにユーザー ID と組織 ID を保存して、後でこれらを検索できるようにし、組織またはユーザーが別の組織に追加したアドレスを選択できるように、複数のアドレスを保持したいと考えています。ここでの例は、2 つの組織が同じプロパティを共有している場合です。また、組織テーブルにデフォルトのアドレス ID を保存したいと考えています。ただし、FuelPHP で ORM モデルを使用する場合、これは扱いにくいことがわかります (おそらく無関係です。設計上の弱点の可能性に注意を払う必要がありました)。

上記は 1 つのオプションです。あと 2 つの解決策が考えられます。1 つは、組織 ID とアドレス ID を格納するデフォルトのアドレス テーブルを用意することです。アドレス テーブルには、引き続きユーザー ID と組織 ID を格納できます。次に、組織テーブルの内部結合からデフォルトのアドレス テーブルを選択し、アドレス テーブルからアドレス ID を内部結合してアドレスを取得します。

2 番目のオプションは、アドレス テーブルにデフォルトのアドレス フィールドを bool 型として設定することです。次に、select で where ステートメントを使用して、必要に応じてこのアドレスを取得します。

2 番目のオプションは、テーブルを変更したり、キーを追加したり、PHP フレームワークの ORM モデルに関係を設定したりする作業をあまり行う必要がないため、現時点では私の好みのオプションです。ただし、データベースが大きくなり、パフォーマンスが問題になる場合、これらの方法のどれが最適ですか? 私が考慮していない他の方法はありますか?

4

2 に答える 2

2

Organization と Address の間に m:m (多対多) の関係があるようです。したがって、データベースでこれを表す最良の方法は、この関係を表す新しいテーブルを導入することです。

特定の会社のデフォルトのデフォルトアドレスを意味するのか、会社を作成するときの特定のユーザーのデフォルトを意味するのかわかりません。最初のケースでは、関係を表す新しく作成されたテーブルの属性としてこれを追加します。後者の場合、ユーザー テーブルに外部キーを配置して、デフォルト アドレスを表すことができます。

パフォーマンスに関しては、整数キーを使用し、適切なインデックスを作成してください...! とはいえ、もちろん、関係テーブルをスキップして、同じ住所で異なる会社の類似の住所を作成する方が高速です。これにより、company+addresses ルックアップに 1 回参加する手間が省けます。ただし、特定の住所にあるすべての企業を検索する必要がある場合は、さまざまな住所を読み取って比較する必要があるため、これは非常に遅くなります。

そのため、データをどのように使用したいかによってすべてが少し異なります。私は「正しい」オプション (新しいリレーションシップ タルベ) を使用します。正しいインデックスを使用してもそれほど遅くはなく、後でより多くの可能性が得られるからです。

次の質問は、新しいユーザーに、重複したエントリを作成するのではなく、既存のアドレスを選択してもらう方法です.これはインターフェイス設計の課題であり、収集するデータの品質はそれに大きく依存します.

于 2012-04-03T21:39:52.017 に答える
1

個人的には、次のようになります。

Organization
-------------
OrgID
OtherOrgColummns

Address
-------------
AddressID
OtherAddressColumns

OrgAddresses
-------------
OrgID
AddressID
IsDefault

これがあなたの説明に基づいて機能するかどうかはわかりませんが。

警告の言葉- 同じアドレスを書き出す方法は約 10,000 通りあります。例えば:

111 First Street
111 1st street
111 1st st.
111 1st str
etc.

人々が重複して入力することについてあなたがどの程度懸念しているかはわかりませんが、それが問題になる場合は、ジオコーディング サービスを使用して住所の緯度を取得し、緯度経度を使用して住所が既にあるかどうかを判断することをお勧めします。あなたのDBで...ちょっと考えて...

于 2012-04-03T21:40:09.397 に答える