2008-12-29 11 views
0

Je veux créer une table qui a simplement deux colonnes entières pour servir de table de correspondance entre deux ensembles de données différents et je souhaite y placer les contraintes correctes.Une table de mappage un-à-un correcte

J'ai initialement défini les deux colonnes comme une clé primaire composée, mais je me suis rendu compte que cela représente plusieurs à plusieurs, ne faisant que dupliquer de nombreuses mappages.

Comment spécifier que les deux colonnes doivent être des entiers uniques dans toutes les lignes? J'utilise MS SQL, mais je suppose que c'est une question générale de conception de base de données.

+0

Pourquoi auriez-vous besoin d'une table de relations pour un mappage un-à-un? Une colonne de clé étrangère dans l'une des tables de données ne ferait-elle pas l'affaire? – Ole

+0

Je suppose que ma raison est que je peux laisser la conception des deux tableaux que je lie seul et avoir une table qui ne représente logiquement que le mappage. – spilliton

Répondre

1

Créer une clé primaire sur une colonne et une autre contrainte unique unique ou un index unique, sur l'autre.

CREATE TABLE [dbo].[test](
    [x] [int] NOT NULL, 
    [y] [int] NOT NULL, 
    CONSTRAINT [PK_test] PRIMARY KEY CLUSTERED 
    ([x] ASC) 
    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
     IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
     ALLOW_PAGE_LOCKS = ON) 
    ON [PRIMARY]) 
ON [PRIMARY] 

CREATE UNIQUE NONCLUSTERED INDEX [IX_test] ON [dbo].[test] 
    ([y] ASC) 
    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
     SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, 
     DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, 
     ALLOW_PAGE_LOCKS = ON) 
ON [PRIMARY] 
0

Utilisez une contrainte de colonne UNIQUE sur chaque colonne.

2

Création d'une autre table est fait pour créer une relation plusieurs à plusieurs, vous ne devriez probablement pas avoir créé (à moins que je manque quelque chose).

L'un à un obligatoire est le même que d'avoir les deux tables sous forme de table unique. Le seul acceptable à un est facultatif, et vous devez simplement relier les deux tables, aucune troisième table n'est nécessaire.

+0

sauf si la table supplémentaire est créée en tant que dénormalisation pour améliorer les performances. Si, par exemple, cette table de mappage sera touchée par des requêtes 1000x/seconde, alors que la table principale est très large et ne sera frappée que quelques fois par jour ... –

+0

Bien sûr, mais peut être atteint par certains SGBD grâce au partitionnement. –

+0

oui, on parle de partitionnement vertical (ou est-ce horizontal?). et si oui ou non le SGBD a des capacités spéciales pour le faire, vous pouvez le faire manuellement en créant une autre table un-à-un à partir d'un sous-ensemble des attributs des tables –