¿Deberían dividirse las relaciones uno a uno en dos tablas?

Tengo una tabla [Usuarios] y otra tabla [Administradores] vinculada 1: 0..1. ¿Es una buena práctica fusionar estas tablas? He leído muchas respuestas sobre SO que indican que dividir tablas solo es necesario para las relaciones de uno a muchos.

Mi razonamiento para separarlos es para poder hacer referencia a los administradores con AdministratorId en lugar del UserId general. En otras tablas, tengo campos que solo deberían contener un administrador, por lo que actúa como una verificación de referencia.

preguntado el 08 de noviembre de 11 a las 13:11

Depende de cómo utilice los datos. Si tiene una buena razón para dividir las tablas, divídalas; sin embargo, si tiene una buena razón para combinarlas, hágalo. La normalización solo es buena si puede respaldarla con una razón práctica. -

5 Respuestas

Existe una regla general que establece que una tabla modela una entidad / clase o la relación entre entidades / clases, pero no ambas. Sin embargo, es solo una regla, ¡nunca digas nunca!

SQL generalmente tiene un problema con las tablas de relación 1: 1 dedicadas porque las únicas restricciones entre tablas que se encuentran comúnmente son las claves externas. Sin embargo, un FK no requiere que exista un valor en el referenciando mesa. Esto hace que la relación sea 1: 0..1 ("uno a cero o uno"), que suele ser aceptable.

El estricto 1: 1 requiere una solución. Debido a que SQL carece de asignación múltiple, la solución generalmente implica recurrir a código de procedimiento, por ejemplo, dos FK "bidireccionales" diferibles; desencadenantes forzar actualizaciones a través de procesos almacenados CRUD; etc.

Por el contrario, modelar una relación 1: 1 en la misma tabla es fácil: declare ambas columnas como NOT NULL!

Respondido 31 Jul 13, 18:07

SQl es fácil de hacer cumplir una relación uno a uno. Utiliza Fk como PK en la segunda tabla. - HLGEM

@HLGEM: "USTED usa el Fk como el PK en la segunda tabla", eso significaría que podría haber no más de uno valor de referencia. Pero no obliga en absoluto a que aparezca un valor en la tabla de referencia ("segunda"). Por lo tanto, es uno a cero o uno, no estrictamente uno a uno. Di que las mesas son Orders y OrderDetails. La regla comercial es: "Cada pedido debe tener exactamente un detalle de pedido". El FK es OrderDetails referencias Orders. Si agrega una fila al Orders tabla (me disculpo, pero solo está disponible en Inglés) , de manera entonces el FK está satisfecho pero la regla comercial no. - un día cuando

Creo que la mejor opción es tener dos tablas para las dos entidades diferentes, Users y Administrators, posiblemente con el mismo Primary Key.

CREATE TABLE User
( UserId int
, ... other data               --- data for all users
, PRIMARY KEY (UserId)
) ;

CREATE TABLE Administrator
( AdministratorId int
, ... other data               --- data for administrators only
, PRIMARY KEY (AdministratorId)
, FOREIGN KEY AdministratorId
    REFERENCES User(UserId)
) ;

De esta forma, como mencionas, otras tablas pueden hacer referencia al AdministratorId:

CREATE TABLE OtherTable
( OtherTableId int
, AdministratorId int
, ... other data
, ...
, FOREIGN KEY AdministratorId
    REFERENCES Administrator(AdministratorId)
) ;

Beneficios:

  • La integridad referencial se implementa trivialmente.
  • los datos relevantes (para usuarios y administradores) se pueden almacenar en las tablas relevantes para que tenga menos columnas en las tablas y menos NULL datos.
  • cualquier consulta que necesite un JOIN a Administrator La tabla tendrá que buscar solo unas pocas filas, en comparación con el (posiblemente enorme) número de filas del User mesa. Si solo tiene una tabla, terminará con un código como:

    WHERE User.admin = True

    que puede que no se optimice fácilmente.

respondido 08 nov., 11:17

Hay varias razones por las que es posible que desee mantenerlas separadas. Una es si los registros de una tabla representan un subconjunto de los registros de la otra. Este patrón se llama subclasificación y es claramente el caso en su situación.
Esto es aconsejable incluso si los campos (los datos) que necesita almacenar sobre los administradores no son diferentes de los datos que necesita almacenar sobre todos los usuarios. Otra razón es si los patrones de uso de algunas columnas son muy diferentes (mayor frecuencia de acceso) de los patrones de uso del resto de columnas.

Respondido 13 Oct 16, 15:10

Es común tener tablas en una relación uno a uno. Primero, si son entidades separadas que deberán consultarse por separado o si son subclases (como en su caso), entonces la tabla separada tiene sentido. Además, si la tabla principal es demasiado grande para el tamaño máximo de registro, tiene sentido tener una tabla adicional en una relación uno a uno. Finalmente, tiene el caso en el que la relación es 1-1 ahora, pero tiene el potencial de ser 1-muchos en el futuro, como cuando solo tiene un número de teléfono ahora pero probablemente necesite almacenar más más adelante. En este caso, será menos complicado seguir adelante y convertirlo en una tabla separada.

La pieza fundamental para establecer una relación 1-1 es aplicarla como 1-1. La forma más sencilla de hacer esto es hacer que el campo FK sea también el campo PK en la segunda tabla.

respondido 08 nov., 11:20

Permítanme ceñirme primero al título de su pregunta.

Sí, la relación uno a uno se puede dividir en diferentes tablas cuando necesite lo siguiente:

  1. Modularidad
  2. Seguridad / abstracción de datos

Supongo que el bit de modularidad es bastante claro.

El bit de seguridad también es obvio, ya que necesitará acceso a ambas tablas para obtener la imagen completa de los datos.

Por ejemplo, supongamos que tiene lo siguiente como escenario:

Cliente y Pasaporte son dos tablas diferentes. Donde, el cliente tiene una identificación ficticia para el pasaporte y la tabla de pasaporte no tiene la información del cliente correspondiente. Por lo tanto, la persona con acceso a ambas tablas solo puede asignar la identificación del pasaporte con el cliente y ver la imagen completa.

Respondido 08 Oct 20, 15:10

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.