33 votes

Définition d'une relation un à un dans SQL Server

J'ai besoin de définir un one-to-one relation, et n'arrive pas à trouver la bonne façon de le faire dans SQL Server.

Pourquoi un one-to-one relation demandez-vous?

Je suis en utilisant WCF comme un DAL (Linq) et j'ai une table contenant une colonne BLOB. Le BLOB presque jamais de changements et il serait un gaspillage de bande passante pour le transfert de travers chaque fois qu'une requête est faite.

J'ai eu un coup d'oeil à cette solution, et bien que cela semble une excellente idée, je peux juste voir Linq d'avoir un peu de hissy fit lors de la tentative de mettre en œuvre cette approche.

Des idées?

76voto

Damir Sudarevic Points 14125

Le one-to-one est en fait fréquemment utilisé dans les relations super-type / sous-type. Dans la table enfant, la clé primaire sert également de clé étrangère à la table parent. Voici un exemple:

texte alternatif

 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
 

3voto

Myles Points 6186

Pourquoi ne pas rendre unique la clé étrangère de chaque table?

2voto

Tamil.SQL Points 214

il n’existe pas de relation explicite un à un.

Mais, du fait que tbl1.id et tbl2.id sont des clés primaires et que tbl2.id est une clé étrangère faisant référence à tbl1.id, vous avez créé une relation implicite 1: 0..1.

1voto

DenNukem Points 3455

Mettre 1:1 des articles liés sur la même ligne dans la même table. C'est là que "la relation" dans "base de données relationnelle" vient de choses se rapportant à aller dans la même ligne.

Si vous souhaitez réduire la taille des données circulant sur le fil à envisager de projeter seulement les colonnes:

SELECT c1, c2, c3 FROM t1

ou de créer une vue qui n'projets colonnes pertinentes et d'utiliser ce point de vue en cas de besoin:

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

Notez que les BLOBs sont stockés hors de la ligne de SQL Server, de sorte que vous ne sont pas économisant beaucoup d'e / s disque par verticalement-le partitionnement des données. Si ces événements n'étaient pas des colonnes BLOB vous pouvez bénéficier de partitionnement vertical comme vous l'avez décrit, parce que vous ferez moins d'e / s disque de balayage de la table de base.

0voto

JohnnyBizzle Points 354

Que dis-tu de ça. Liez la clé primaire de la première table à la clé primaire de la deuxième table.

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

Mon problème était que j'ai un processus en 2 étapes avec des champs obligatoires dans les deux. L'ensemble du processus pourrait être classé comme un épisode (mis dans le même tableau), mais il y a une étape initiale et une étape finale.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X