Muchos a muchos Relación Diseño – Intersección de Diseño de la Tabla

Me pregunto qué mejor que el diseño es para la intersección de la tabla para muchos-a-muchos de relación.

Los dos enfoques estoy considerando son:

CREATE TABLE SomeIntersection 
(
     IntersectionId UNIQUEIDENTIFIER PRIMARY KEY,
     TableAId UNIQUEIDENTIFIER REFERENCES TableA NOT NULL,
     TableBId UNIQUEIDENTIFIER REFERENCES TableB NOT NULL,
     CONSTRAINT IX_Intersection UNIQUE(TableAId, TableBId )
) 

o

CREATE TABLE SomeIntersection 
(
     TableAId UNIQUEIDENTIFIER REFERENCES TableA NOT NULL,
     TableBId UNIQUEIDENTIFIER REFERENCES TableB NOT NULL,
     PRIMARY KEY(TableAId, TableBId )
) 

Hay beneficios a uno sobre el otro?

EDIT 2:****por Favor Nota: I plan para el uso de Entity Framework para proporcionar una API para la base de datos. Con eso en mente, ¿ una solución que funcione mejor con la EF, que el otro?

EDICIÓN: En una nota relacionada, por una intersección de la tabla que las dos columnas hacen referencia a la misma tabla (ejemplo abajo), hay una manera de hacer que los dos campos diferentes en un registro?

CREATE TABLE SomeIntersection 
(
     ParentRecord INT REFERENCES TableA NOT NULL,
     ChildRecord INT REFERENCES TableA NOT NULL,
     PRIMARY KEY(TableAId, TableBId )
)

Quiero prevenir de la siguiente

ParentRecord          ChildRecord
=================================
      1                    1         --Cyclical reference! 
  • Para evitar que su ejemplo (que se llama «Auto-referencia»), es suficiente para añadir una RESTRICCIÓN CHECK en el nivel de TABLA «ALTER TABLE dbo.SomeIntersection ADD CONSTRAINT CHK_SomeIntersection_SelfRefNoNono de VERIFICACIÓN (ParentRecord <> ChildRecord)» — Pero usted no va a resolver el caso de Un->B->C>de esta sencilla manera.
  • Estoy más preocupado acerca de la auto-referencias de alrededor de referencias, gracias!
InformationsquelleAutor Dan McClain | 2009-06-10

11 Kommentare

  1. 9

    La segunda versión es la mejor para mí, que evita la creación de un extra de índice.

    • He aceptado esta respuesta, ya que funciona mejor con Entity Framework. La intersección/cruce de la tabla de pliegues muy bien a las Entidades generadas en el modelo.
    • Usted necesitará otro índice en la segunda versión si desea acceder a la intersección de la tabla de la Tabla B.
  2. 13

    Es un tema de debate. Yo prefiero la primera forma, porque yo considero que es mejor que ser capaz de mirar el mapa de la fila por un único valor, y como para hacer valer tal vez un tonto-consistencia de tener una sola columna de clave principal disponible en cada mesa sin fallar. Otros piensan que esa columna es un tonto desperdicio de espacio.

    De cumplir para un par de rondas de bare-knuckle de boxeo en un bar de Nueva Jersey cada par de meses.

    • Estoy de acuerdo en que una fila de identidad puede venir en muy útil, especialmente si alguna vez llega un momento cuando iba a necesitar un directo refrence a la correlación. +1 para el bare-knuckle el boxeo, la primera regla de la DBA Club de la Lucha…
    • Bien puestos. Yo prefiero la segunda, pero todavía votaron. Minas de una cerveza, gracias 🙂
    • Valdría la pena señalar Entity framework trata el PK’less interesect tabla de forma diferente que un PK d tabla
  3. 10

    Uso versión-1 si su «intersección» en realidad ES una entidad propia, lo que significa:

    • tiene propiedades adicionales
    • usted puede buscar para los objetos (y no navegar por una relación)

    Usuario de la versión 2 si es puramente N-M relación de la tabla. En cuyo caso también asegúrese de que:

    • tiene su PK (AGRUPADO) con la primera columna correspondiente a la tabla de búsqueda más a menudo: por ejemplo, si las tablas son de Persona Dirección, entonces supongo que podría buscar todas las direcciones-de-una-persona con más frecuencia, a continuación, para todos-personas-en-este-dirección. Así que usted debe poner su PK para incluir PersonID primera
    • usted todavía puede tener otro de una columna de identificador ÚNICO, pero sólo:

      1. bien no se trata de un PK
      2. o hacer un PK, pero de especificar que NO AGRUPADOS, de modo que usted puede utilizar en CLÚSTER para el índice ÚNICO que abarcan dos referencias a columnas
      3. a menos que usted use el Guid de por su diseño, puede, a continuación, se adhieren a INT columna de IDENTIDAD tipo

    En ambos casos, puede que desee crear otro ÍNDICE que cubre las 2 columnas, pero en otro orden, si se busca desde el otro lado de la relación a menudo.

  4. 4

    si usted va con la primera, sólo tiene que utilizar una IDENTIDAD en el PK, usted no necesita perder el espacio (el disco y la memoria caché) con un UNIQUEIDENTIFIER .

  5. 4

    Lo que están construyendo es llamado una «Intersección».

    Tengo un claro recuerdo de mi base de datos de profesor en la escuela diciendo que una intersección relación es casi siempre una entidad en su propio derecho, y por lo que normalmente vale la asignación de espacio para ella como tal. Esto parece indicar que la primera es más «correcto».

    Que dijo, yo personalmente tienden a preferir el último. Realmente depende de si usted jamás va a recuperar uno de estos registros directamente o si sólo se va a utilizar la mesa a la hora de incorporarse en una de las tablas originales.

    • usted trajo un gran punto… creo que lo que dijo el profesor tiene sentido para mí.
  6. 3

    Desde la perspectiva del desarrollador vista, yo prefiero la primera.
    Es más fácil escribir y probar cuando se trata con ella.

    No necesito de verificación para dos claves para recuperar un registro único.

  7. 3

    Si usted no tiene ninguna campos adicionales en la intersección de la tabla que realmente no necesita un ID de su propia, y la adición de uno no aporta ningún beneficio. Sin embargo, si te vas a poner a otros campos en la tabla, y en muchos casos usted, debe tener su propio ID como clave principal.

    Regla de oro, por supuesto, pero hay que ir.

    • ¿Por qué debería tener un ID, porque otros se añaden las columnas?
    • Porque de repente un elemento en su propio derecho, y usted puede terminar encima de necesitar referirse a ella fácilmente. No hay tabla de requiere un ID, es solo que es algo muy útil. Como ya he dicho, la regla de oro.
  8. 3

    Respondiendo a tu segunda pregunta…

    Sólo se necesita añadir una restricción de comprobación, como este:

    CREATE TABLE SomeIntersection 
    (
         ParentRecord INT REFERENCES TableA NOT NULL,
         ChildRecord INT REFERENCES TableA NOT NULL,
         PRIMARY KEY(TableAId, TableBId),
         CHECK (ParentRecord <> ChildRecord)
    )
  9. 1

    Beneficios de la primera:

    La capacidad de mirar la tabla de combinación, por un valor único. Esto hace que algunos se ven hasta las operaciones más simples en el lado del cliente.

    Algunos Orm (Fluent) también requieren de identificadores en cada entidad para la persistencia para que funcione correctamente.

    Beneficios de la segunda:

    Más simple del modelo de datos, sin la necesidad de crear el índice adicional.

    Menos memoria necesaria.

  10. 1

    La segunda es mejor. Se restringe la caja de empalme de intersección (caja) para no tener más de un aspecto de la misma pareja. Si no hay otras columnas en la caja de conexiones, usted no va a hacer que las búsquedas de esta tabla de todos modos, excepto por la forma de las dos claves foráneas.

    • La primera de ellas hace así «RESTRICCIÓN IX_Intersection ÚNICO(TableAId, TableBId «
  11. 0

    Dado que la TableAId-TableBId combinación es única y que la tabla se utiliza únicamente para implemet muchos-a-muchos de relación me gustaría ir con la segunda opción. Desde un punto de vista puramente lógico el puño implemtnation reduce a la segunda. Desde una perspectiva estructural de las bases de datos de las necesidades para mantener tanto una clave principal/índice así como una restricción en la primera aplicación wereas en el segundo sólo se necesita a maitain la clave principal/index.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea