Integridad referencial sobre la parte de la tabla -- sql campo con sql-server campo con database campo con database-design camp Relacionados El problema

Referential integrity over table portion


0
vote

problema

Español

Estoy diseñando una base de datos y no puedo averiguar cómo modelar la integridad referencial.

Tengo las siguientes tablas

  CREATE TABLE Groups ( GroupId INT PRIMARY KEY, GroupName VARCHAR(50) )  CREATE TABLE GroupMembers ( GroupId INT NOT NULL, MemberId INT NOT NULL, MemberName VARCHAR(50), CONSTRAINT pk_GroupMember PRIMARY KEY (GroupId, MemberId) )  CREATE TABLE Missions ( MissionId INT PRIMARY KEY, GroupId INT NOT NULL, MissionName VARCHAR(50) )  CREATE TABLE MissionRollAssignments ( MissionId INT NOT NULL, MemberId INT NOT NULL, MemberRoll VARCHAR(50)  --This will probably become RollId and move details to another table )   

Cada misión tendrá asignaciones para algunos / todos los miembros del grupo correspondiente. Habrá varias misiones asociadas con cada grupo, pero solo una misión por grupo está activa en un momento dado.

Mi pregunta es:

es posible hacer cumplir la integridad de la referencia para las asignaciones de rodillos, de modo que solo los miembros ¿Se selecciona del grupo correspondiente (dado por el MISIONID)? Sé que puedo filtrar esto de la GUI, pero me sentiría más cómoda si pudiera crear una restricción de FK de MissionRollassignments a GroupMembers al considerar el Grupo indicada en la Misión.

Una segunda pregunta sería si los chicos piensan que esta es una buena manera de modelar mi dominio, o tal vez debería intentar un enfoque diferente.

Gracias de antemano por cualquier ayuda en esto.

Saludos cordiales,
AWER

Original en ingles

I'm designing a database and can't figure out how to model referential integrity.

I have the following tables

CREATE TABLE Groups ( GroupId INT PRIMARY KEY, GroupName VARCHAR(50) )  CREATE TABLE GroupMembers ( GroupId INT NOT NULL, MemberId INT NOT NULL, MemberName VARCHAR(50), CONSTRAINT pk_GroupMember PRIMARY KEY (GroupId, MemberId) )  CREATE TABLE Missions ( MissionId INT PRIMARY KEY, GroupId INT NOT NULL, MissionName VARCHAR(50) )  CREATE TABLE MissionRollAssignments ( MissionId INT NOT NULL, MemberId INT NOT NULL, MemberRoll VARCHAR(50)  --This will probably become RollId and move details to another table ) 

Every mission will have assignments for some/all members of the corresponding group. There will be several missions associated with each group, but only one mission per group is active at a given time.

My question is:

Is it possible to enforce referenciay integrity for roll assignments such that only members of the corresponding group (given by the MissionId) are selected? I know I can filter this from the GUI, but I'd feel more comfortable if I could create a FK constraint from MissionRollAssignments to GroupMembers while considering the GroupId indicated in the Mission.

A second question would be if you guys think this is a good way to model my domain, or maybe I should try a different approach.

Thanks in advance for any help on this.

Best regards,
Awer

           

Lista de respuestas

2
 
vote
vote
La mejor respuesta
 

Podría poner GroupID en MissionRollassignments y luego agregar dos restricciones de la siguiente manera:

  ALTER TABLE MissionRollAssignments  ADD CONSTRAINT fk1 FOREIGN KEY (GroupId, Memberid)  REFERENCES GroupMembers (GroupId, Memberid);  ALTER TABLE MissionRollAssignments  ADD CONSTRAINT fk2 FOREIGN KEY (GroupId, MissionId)  REFERENCES Missions (GroupId, MissionId);   

Para lograr este servidor SQL primero requiere una restricción única (redundante) en (GroupID, MissionID) en la tabla Missions. Otros DBMS no son tan estrictos, pero SQL Server requiere una restricción de clave externa para coincidir exactamente con las columnas de una restricción de unicidad.

 

You could put GroupId into MissionRollAssignments and then add two constraints as follows:

ALTER TABLE MissionRollAssignments  ADD CONSTRAINT fk1 FOREIGN KEY (GroupId, Memberid)  REFERENCES GroupMembers (GroupId, Memberid);  ALTER TABLE MissionRollAssignments  ADD CONSTRAINT fk2 FOREIGN KEY (GroupId, MissionId)  REFERENCES Missions (GroupId, MissionId); 

To achieve this SQL Server first requires a (redundant) UNIQUE constraint on (GroupId, MissionId) in the Missions table. Other DBMSs are not so strict but SQL Server requires a FOREIGN KEY constraint to match exactly the columns of a uniqueness constraint.

 
 
       
       
0
 
vote

Debe usar las claves externas para reforzar esto, por ejemplo, MISION.GROURID debe referirse a GROUP.GROURID.

 

You should use Foreign Keys to reinforce this, eg Mission.GroupId should refer to Group.GroupId.

 
 
 
 
0
 
vote

¿Es posible hacer cumplir la integridad de la referenciación para las asignaciones de rollos, de que solo se seleccionan los miembros del grupo correspondiente (dado por el MISIONID)?

si. Debe usar las relaciones de identificación para propagar el GroupId hasta la parte inferior de esta dependencia "en forma de diamante", similar a esta:

ingrese la descripción de la imagen aquí

NOTA FK1 y FK2 FRENTE DE MissionRollAssignment.GroupId , lo que indica que existen llaves extranjeras sobre los "lados" de este "en forma de diamante" "Dependencia.


Como una misión única activa se puede modelar como una clave externa en la dirección opuesta, en este caso, en este caso, como Group {GroupId, ActiveMissionNo} que hace referencia a la tecla principal Mission6 .

Dicha llave extraña circular presenta un problema de "pollo y huevo" en un DBMS que no admite restricciones diferidas (que SQL Server no). Sin embargo, puede simplemente dejar Group.ActiveMissionNo null-capaz, por lo que un DBMS que hace cumplir las llaves extranjeras en un Match simple Moda (que hace SQL Server) ignorará toda la clave externa compuesta si solo uno de sus campos es nulo. Esto le permitirá "deshabilitar" temporalmente la clave externa y romper el ciclo de "pollo y huevo" al insertar nuevos datos.

 

Is it possible to enforce referenciay integrity for roll assignments such that only members of the corresponding group (given by the MissionId) are selected?

Yes. You need to use identifying relationships to propagate the GroupId all the way down to the bottom of this "diamond-shaped" dependency, similar to this:

enter image description here

Note FK1 and FK2 in front of MissionRollAssignment.GroupId, indicating that foreign keys exist up the both "sides" of this "diamond-shaped" dependency.


As single active mission can be modeled as a foreign key in the opposite direction, in this case as Group {GroupId, ActiveMissionNo} that references the Mission primary key.

Such circular foreign key presents a "chicken-and-egg" problem on a DBMS that doesn't support deferred constraints (which SQL Server doesn't). However, you can just leave Group.ActiveMissionNo NULL-able, so a DBMS that enforces foreign keys in a MATCH SIMPLE fashion (which SQL Server does) will ignore the whole composite foreign key if just one of its fields is NULL. This will allow you to temporarily "disable" the foreign key and break the "chicken-and-egg" cycle when inserting new data.

 
 

Relacionados problema

0  ¿Cómo los proveedores de servicios móviles administran los datos de tiempo de aire? [cerrado]  ( How do mobile service providers manage airtime data ) 
cerrado . Esta pregunta debe ser más enfocado . Actualmente no está aceptando respuestas. ...

286  Patrones de diseño de bases de datos relacionales? [cerrado]  ( Relational database design patterns ) 
cerrado . Esta pregunta debe ser más enfocado . Actualmente no está aceptando respuestas. ...

6  Campamento relacional y desarrollo de bases de datos "del mundo real"  ( Relational camp and real world database development ) 
Pasado más de una década desde la primera publicación de la fecha de la fecha y Darwen's "el tercer manifiesto" en 1995. ¿Cuál es el lugar de la escuela d...

2  Táctica de normalización de SQL Server: Varchar vs INT Identity  ( Sql server normalization tactic varchar vs int identity ) 
Estoy preguntando cuál es la solución óptima aquí. Di que tengo una base de datos normalizada. La clave principal de todo el sistema es un varchar. ¿Qué me ...

2  Clonación de datos jerárquicos  ( Cloning hierarchical data ) 
Supongamos que tengo una tabla jerárquica. Construir la forma clásica como esta: CREATE TABLE test (name text,id serial primary key,parent_id integer refer...

0  Mejores prácticas para el seguimiento de activos mysql jerárquico  ( Best practice for hierarchical mysql asset tracking ) 
Estoy escribiendo un rastreador de activos del proyecto en línea, pero soy nuevo en MySQL. ¿Cuál sería la mejor manera de rastrear proyectos, usuarios y activ...

0  Problema de diseño SQL - Artículos en múltiples secciones  ( Sql design problem items in multiple sections ) 
Tengo una tabla de secciones y una tabla de elementos. El problema es que cada elemento puede estar en una o más secciones, por lo que una simple 'sección' ...

4  ¿Debo reflejar la estructura de la base de datos en la solicitud?  ( Should i reflect database structure in application ) 
Estoy diseñando una aplicación que permitirá poner algunos datos en la base de datos. Quería reflejar de alguna manera la estructura de la base de datos en la...

4  ACCESO DE MS: Cambiar el nombre programáticamente columnas  ( Ms access programmatically rename columns ) 
Necesito actualizar todos los nombres de columnas en una base de datos de acceso de 8 tablas. En resumen, cada subrayado en un nombre de columna debe reemplaz...

353  Diagrama de base de datos de generación automática MySQL [CERRADO]  ( Auto generate database diagram mysql ) 
cerrado. Esta pregunta no cumple con pautas de desbordamiento de pila . Actualmente no está aceptando respuestas. ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos