La création de tables PostgreSQL + relations - des PROBLÈMES avec les relations UN À UN
Donc je suis censé créer ce schéma + relations exactement de la manière dont cette disquette de réparation d'urgence représente. Ici, je ne montrons que les tables que je vais avoir des problèmes avec:
Donc je suis en train d'en faire un pour un, mais pour une raison quelconque, peu importe ce que je change, je reçois un à plusieurs sur ce tableau a la clé étrangère.
C'est mon sql pour ces deux tables.
CREATE TABLE lab4.factory(
factory_id INTEGER UNIQUE,
address VARCHAR(100) NOT NULL,
PRIMARY KEY ( factory_id )
);
CREATE TABLE lab4.employee(
employee_id INTEGER UNIQUE,
employee_name VARCHAR(100) NOT NULL,
factory_id INTEGER REFERENCES lab4.factory(factory_id),
PRIMARY KEY ( employee_id )
);
Ici, je reçois la même chose. Je ne reçois pas les une à une relation "un à plusieurs". Invoiceline est une faiblesse de l'entité.
Et voici mon code pour la deuxième image.
CREATE TABLE lab4.product(
product_id INTEGER PRIMARY KEY,
product_name INTEGER NOT NULL
);
CREATE TABLE lab4.invoiceLine(
line_number INTEGER NOT NULL,
quantity INTEGER NOT NULL,
curr_price INTEGER NOT NULL,
inv_no INTEGER REFERENCES invoice,
product_id INTEGER REFERENCES lab4.product(product_id),
PRIMARY KEY ( inv_no, line_number )
);
Je vous serais reconnaissant de toute aide. Merci.
Comment envisagez-vous la relation 1:1 à modéliser? Avec un
Je voudrais avoir les connaissances de base pour répondre à votre question, mais je suis simplement un peu de conférences en dans ma première classe DB. Ma questions est la suivante: Comment puis-je créer un pour une relation? Pour une raison quelconque, nous avons parlé principalement sur le beaucoup de beaucoup de et de un à plusieurs
UNIQUE
contrainte sur la colonne de clé étrangère? Avec une réciproque reportable contrainte de clé étrangère?Je voudrais avoir les connaissances de base pour répondre à votre question, mais je suis simplement un peu de conférences en dans ma première classe DB. Ma questions est la suivante: Comment puis-je créer un pour une relation? Pour une raison quelconque, nous avons parlé principalement sur le beaucoup de beaucoup de et de un à plusieurs
OriginalL'auteur Georgi Angelov | 2013-02-23
Vous devez vous connecter pour publier un commentaire.
Un-à-un n'est pas bien représenté comme un premier de la classe type de relation dans le standard SQL. Comme plusieurs-à-plusieurs, ce qui est réalisé à l'aide d'un connecteur de table et de deux un-à-plusieurs liens, il n'y a pas de véritable "one to one" en SQL.
Il ya un couple d'options:
Créer un ordinaire contrainte de clé étrangère ("un à plusieurs" style) puis ajouter un
UNIQUE
contrainte sur la référence FK colonne. Cela signifie que pas plus d'un de la de se référer à des valeurs qui peuvent apparaître dans la référence de la colonne, c'est l'un-à-un en option. C'est assez simple et très tolérant approche qui fonctionne bien.Utilisation normale FK relation qui pourrait modèle 1:m, et permettent aux applications d'assurer uniquement le 1:1 dans la pratique. Je ne recommande pas cela, il n'y a qu'une petite performance en écriture à la baisse à l'ajout de la FK index unique et il permet de s'assurer de la validité des données, trouver application des bugs, et d'éviter toute confusion de quelqu'un d'autre qui a besoin de modifier le schéma plus tard.
Créer réciproque des clés étrangères - possible uniquement si votre base de données prend en charge non urgente des contraintes de clés étrangères. C'est un peu plus complexe à coder, mais permet de mettre en oeuvre un-à-un obligatoire relations. Chaque entité a une référence de clé étrangère pour les autres " PK dans une colonne unique. L'une ou des deux contraintes doivent être
DEFERRABLE
et soitINITIALLY DEFERRED
ou utilisé avec unSET CONSTRAINTS
appel, puisque vous devez reporter l'un des vérifications des contraintes pour configurer la dépendance circulaire. C'est assez technique avancée qui n'est pas nécessaire pour la grande majorité des applications.De l'utilisation de pré validation déclenche si votre base de données prend en charge, de sorte que vous pouvez vérifier que lorsque l'entité A est inséré exactement une entité B est également inséré et vice-versa, avec des vérifications correspondantes pour les mises à jour et des suppressions. Cela peut être lent et souvent inutile, en plus de nombreux systèmes de base de données ne prennent pas en charge pre-commit des déclencheurs.
Oui,
lab4.employee.factory_id
se référant côté peut être marquéUNIQUE
. Pensez-y: UN FK colonne unique peut contenir au plus un de chaque valeur de la visée-PK colonne. Juste pour direfactory_id
lorsque vous utilisez le nom de plus d'un lieu est un peu comme dire "les Quantas" d'avion à l'aéroport le plan de qui? Notez que cela crée une relation qui est facultatif sur le renvoi de côté; en plus un employé peut gérer une usine, mais il n'y a aucune obligation, compte tenu de l'usine à un gestionnaire.merci. - Ce vraiment clarifie les choses. J'apprécie votre aide.
OriginalL'auteur Craig Ringer