it-swarm-ja.tech

SQL Serverでの1対1の関係の定義

1対1の関係を定義する必要がありますが、SQL Serverでそれを行う適切な方法を見つけることができないようです。

なぜ1対1の関係を求めるのですか?

WCFをDAL(Linq)として使用していて、BLOB列を含むテーブルがあります。 BLOBはほとんど変更されず、クエリが行われるたびにBLOBを転送することは帯域幅の無駄になります。

私は this solution を確認しましたが、素晴らしいアイデアのように見えますが、このアプローチを実装しようとすると、Linqが少しヒス状にフィットしているのがわかります。

何か案は?

33

1対1は、実際にはスーパータイプ/サブタイプの関係で頻繁に使用されます。子テーブルでは、主キーは親テーブルへの外部キーとしても機能します。次に例を示します。

org_model_00

CREATE TABLE Organization
( 
     ID       int PRIMARY KEY,
     Name     varchar(200),
     Address  varchar(200),
     Phone    varchar(12)
)
GO

CREATE TABLE Customer
( 
     ID              int PRIMARY KEY,
     AccountManager  varchar(100)
)
GO

ALTER TABLE Customer
    ADD  FOREIGN KEY (ID) REFERENCES Organization(ID)
        ON DELETE CASCADE
        ON UPDATE CASCADE
GO
76
Damir Sudarevic

各テーブルの外部キーを一意にしませんか?

3
Myles

明示的な1対1の関係などはありません。

しかし、tbl1.idとtbl2.idが主キーであり、tbl2.idがtbl1.idを参照する外部キーであるという事実により、暗黙の1:0..1関係が作成されています。

2
Tamil.SQL

1:1の関連アイテムを同じテーブルの同じ行に入れます。これが、「リレーショナルデータベース」の「関係」の由来です。関連するものが同じ行に入ります。

ネットワーク上を移動するデータのサイズを減らしたい場合は、必要な列のみを投影することを検討してください。

SELECT c1, c2, c3 FROM t1

または、関連する列のみを投影するビューを作成し、必要なときにそのビューを使用します。

CREATE VIEW V1 AS SELECT c1, c2, c3 FROM t1
SELECT * FROM t1
UPDATE v1 SET c1=5 WHERE c2=7

BLOBはSQL Serverの行外に格納されるため、データを垂直分割することでディスクIOを大幅に節約することはできません。これらが非BLOB列である場合、ベーステーブルのスキャンに使用するディスクIOが少なくなるため、前述のようにフォームの垂直分割が役立つ場合があります。

1
DenNukem

私の意見では、LINQクエリでBLOBを読み取らないためのより良い解決策は、BLOB以外のすべての列を含むテーブルにviewを作成することです。

次に、ビューに基づいてEFエンティティを作成できます。

0
Assaf S.

これはどう。最初のテーブルの主キーを2番目のテーブルの主キーにリンクします。

Tab1.ID(PK)<-> Tab2.ID(PK)

私の問題は、両方に必須フィールドがある2段階のプロセスがあることでした。プロセス全体を1つのエピソード(同じテーブルに配置)として分類できますが、初期段階と最終段階があります。

0
JohnnyBizzle