0

SQL Server 2012 には、人、接続、およびメッセージの 3 つのテーブル構造があります。影響を受けるスキーマは次のようになります。

People : Id (pk bigint)、name...
Connections : Id (pk bigint)、IdPpl1 fk、IdPpl2 fk
Messages : Id (pk uniqueidentifier)、Idconnection (fk)、Messagetype (smallint)

Connections テーブルでは、IdPpl1 と IdPpl2 は fk のユーザー ID です。このテーブルに同じ「2 人」が表示される可能性がありますが、列が入れ替わっています。EG:

Id IdPpl1 IdPpl2  
.. ...... ......  
3     101    105  
8     105    101
9     101    106
10    106    101

上記の状況は正しいです。実際、これらはテーブル内のこれらの「2 人」の最大出現回数です。

Messages テーブルには、どの「接続」がメッセージを送信したかに関する情報が保持されます。

Id IdConnection Messagetype
.. ............ ...........
24            3           1
25            8           1
26            3           2
27            8           2
28            9           3
29           10           2

(注: メッセージは一方向です。そのため、同じ 2 人に影響を与える接続テーブルに 2 つの行が存在する可能性があります。最初の行では、1 人が送信者であり、もう 1 人が受信者であり、2 番目の行では交換されます)

People Id が与えられた場合、「相互に接続された人々によって相互に送信された最小の接続タイプ メッセージ」と、メッセージ タイプが一致するかどうかを示す追加の列を表示する SQL クエリが必要です。People ID 101の場合、結果は次のようになります。

Person_id Person_name IdConnection MatchingMsgType
......... ........... ............ ...............
      105        John            3               1 
      106       Peter            9               0 

最初の行は、MsgIds 24 と 25 のために表示されます。メッセージ 26 と 27 に対応する可能性のある行は表示されません。以前に一致するメッセージ タイプが見つかったためです。2 番目の行は、MsgId が 28 と 29 であるため表示され、メッセージ タイプが一致しないことを示しています。

現在、私はすべての「人に関連するメッセージ」を取得し、データテーブルの並べ替え、フィルタリング、およびメモリ内での操作を繰り返しています。

完全な SQL ソリューションを使用しますか (アプリ層間の完全な分離を維持したい)、またはデータテーブルの反復の方が適していますか?

前もって感謝します!!

4

1 に答える 1

0

明らかに、現在の db クエリの結果セット (ユーザーに関連するすべての行を生成するもの) の長さに依存します。行がテーブルから削除されるかどうかは明確ではありません。そうでない場合、一致する行の数が永遠に増えるため、ソリューションはスケーリングされません。代わりに、結果の行数に何らかの制限があると断言できる場合 (たとえば、ユーザーが同時に開くことができる接続の最大数)、解決策は十分である可能性があります。

于 2013-01-21T14:51:16.680 に答える