2009-10-19 11 views
0

Je me demandais si vous pouviez spécifier l'ordre dans lequel les définitions de tables et les fixtures de données sont chargés en utilisant la CLI. Mon problème est que j'ai deux tables, chacune ayant une contrainte de clé étrangère pointant vers l'autre, donc l'une des contraintes doit être ajoutée après qu'un enregistrement a été ajouté. Ou peut-être qu'il y a une meilleure façon de faire ça ... Je ne suis pas expert en db et ma tête est floue aujourd'hui.Doctrine PHP Question

Schéma:

CREATE TABLE clients (
    id INT AUTO_INCREMENT, 
    name VARCHAR(255), address VARCHAR(255), 
    primary_contact_user_id INT # References a user record in the users table 
    ... 
); 

CREATE TABLE users (
    id INT AUTO_INCREMENT, 
    username VARCHAR(255), 
    client_id INT # References a client record in the clients table 
    ... 
); 

ALTER TABLE clients 
    ADD CONSTRAINT clients_primary_contact_user_id_users_id 
    FOREIGN KEY (primary_contact_user_id) REFERENCES users(id); 

ALTER TABLE users 
    ADD CONSTRAINT users_client_id_clients_id 
    FOREIGN KEY (client_id) REFERENCES clients(id); 

Répondre

1

Je suis pas non plus un expert DB, mais je passe beaucoup de temps à travailler avec eux. Je crois que la référence circulaire est réellement incorrecte. Indépendamment de savoir si la théorie de la base de données la sanctionne ou non, vous pouvez obtenir un champ à travers une jointure à une autre table, il s'agit donc d'une référence circulaire inutile. Je suggérerais que vous en éliminiez un et que vous modifiiez les requêtes pour refléter ce changement.

D'après une estimation, je vous suggère d'éliminer primary_contact_user_id, comme cela semble presque comme un possible many-to-many où un seul élément est élu « primaire » ...

Si vous sentir ce design est nécessaire, pouvez-vous s'il vous plaît expliquer pourquoi?

+0

Merci pour la suggestion, c'est en fait ce que je pensais juste après avoir regardé ma question. Et non, ce n'est pas crucial de garder le design tel qu'il est. –

0

placez les instructions INSERT entre les instructions CREATE TABLE et ALTER TABLE.