Si y no. No es ortodoxo, pero no es completamente erróneo.
La regla de las FK dice que entre dos tablas con una cardinalidad 1:1, se puede poner el campo FK
en cualquiera de las dos, pero sólo en una.
El problema es conceptual: En este modelo:
Código sql:
Ver originalCREATE TABLE USER (
id BIGINT AUTO_INCREMENT,
username TEXT,
password TEXT,
contact_id BIGINT,
INDEX contact_id_idx (contact_id),
PRIMARY KEY(id)) ENGINE = INNODB;
CREATE TABLE contact (
id BIGINT AUTO_INCREMENT,
first_name TEXT,
last_name TEXT,
phone TEXT,
email TEXT,
address TEXT,
PRIMARY KEY(id)) ENGINE = INNODB;
ALTER TABLE USER
ADD FOREIGN KEY (contact_id)
REFERENCES contact(id);
El contacto existe antes que el usuario. Eso sólo tiene sentido en el contexto de un determinado modelo de sistema que requiera, por ejemplo, que un usuario haya entrado antes como contacto, para permitirle ser usuario.
Eso, desde el vamos, depende de las reglas del negocio, por lo que es algo que el Analista tiene que estipular.
Hay, de todos modos un problema en el modelo: Está usando palabras reservadas para los nombres de campos, lo que puede hacer que a la hora de las consultas se generen errores casi indetectables.