9

クライアントとサービスを一致させるためのモデルを検討してください。クライアントは、さまざまな時点でサービスのプロバイダーとコンシューマーの両方である可能性があります。クライアントは個人またはグループ(企業)であり、後者は複数の連絡先を持っています。連絡先には、複数のアドレス、電話、電子メールが含まれる場合があります。これらの関係の一部は1対1(たとえば、プロバイダーへのサービス)になりますが、ほとんどは1対多または多対多になります(会社の複数の連絡先は同じアドレスを持ちます)。

このモデルでは、通常、client_contact、contract_addr、contact_phone、contact_email、service_provider、service_consumerなどの複数の関連付けテーブルが存在します。

特定のサービスの消費者の連絡先情報に対して簡単なクエリを発行するとします。データを含む6つのエンティティテーブルに加えて、結合は5つの関連テーブルを参照します。もちろん、この種のクエリについて特に興味深いことは何もありません。私たちは毎日それを行っています。

しかし、それは私に思い浮かびました。すべての関連付けを保持する単一の「マスター」連想テーブルを持っていないのはなぜですか?このマスターテーブルには、2つのPKに加えて「関連付けタイプ」が必要であり、すべてのPKが同じタイプ(int、GUIDなど)である必要があります。

一方では、各結合でタイプとPKを指定する必要があるため、クエリはより複雑になります。一方、すべての結合は同じテーブルにアクセスし、適切なインデックス作成とキャッシュのパフォーマンスが劇的に向上する可能性があります。

このアプローチを説明するパターン(またはアンチパターン)があるかもしれないと思いましたが、オンラインでは何も見つかりませんでした。誰かがそれを試しましたか?もしそうなら、それはスケーリングしますか?

あなたが提供できるどんな参考文献もいただければ幸いです。

4

3 に答える 3

1

あなたが説明していることは、データ ウェアハウジングのファクト テーブルを思い出させます。私の理解では、すべての多対多の関係をモデル化するためのテーブルを備えた典型的なトランザクション スキーマから始めるということです。次に、ディメンション分析を容易にするためにデータを再構築するために、スキーマ内の一部またはすべての関係を、各列がキーである 1 つの幅の広いテーブルに集約できます。これにより、可能なすべての結合が事前に効果的に実行され、それらがテーブルにダンプされます。クエリ結合の目的は、関係の追跡からエンティティのプロパティへの取得に反転します。

とにかく、このことについての私の理解は漠然としており、私の経験は事実上ゼロですが、おそらくあなたのアイデアは別の名前のファクトテーブルであり、調査に役立ちます.

于 2010-11-30T00:46:37.147 に答える
0

まず第一に、保守性の面で間違いなく代償を払っていると思います。そのような「タイプ」列があるときはいつでも、危険信号だと思います。プロシージャで魔法の文字列につながる可能性が高いようです-たとえば、挿入と選択全体で型が一貫していることを確認する必要があります。したがって、パフォーマンスの向上は、この頭痛の種を正当化するのに十分な大きさである必要があります。

第 2 に、より多くのデータを格納するために代償を払っています。つまり、関連付けごとに追加の「タイプ」列が必要です。そして、クエリを実行するときにこのデータを取得する必要があります。これは、一度にメモリに格納できる行数に影響します (おそらく)。

第 3 に、複数のテーブルに格納されているか 1 つのテーブルに格納されているかに関係なく、各クエリはおそらく同じ合計数の行にアクセスする必要があります。したがって、クラスター化インデックスなどを作成できるデータについて何かを知っていない限り、クエリを実行すると、おそらく同じ数のページを取得することになります。

第 4 に、パフォーマンスが向上する可能性があるのは、インデックスが対数の動作をすることを想定し、5log(N) が log(5N) よりも大きいことに注意することです。そのため、5 つの小さいインデックスよりも 1 つの大きなインデックスを使用する方が適切です。ただし、タイプ列を追加すると、この利点が減少します。それが完全に排除されるのか、それとも単に減少するのかを分析する方法がよくわかりません.

第 5 に、少なくとも一部のクエリでは、その巨大なテーブルの複数のコピーを結合することになる可能性が非常に高いようです。

どのような結果が得られるか興味がありますが、パフォーマンス上の利点がある場合は驚くでしょう。

于 2010-12-04T23:39:39.553 に答える
0

これは、抽象化とテーブルの継承で解決できます。

個々のクライアント、組織のクライアント、サービス プロバイダーはすべて当事者であり、役割を果たします。

電子メール アドレス、電話番号、Web アドレス、物理アドレスはすべてアドレスです。

于 2013-06-17T00:32:23.280 に答える