una tablas tabla relacionar referencial por llave integridad foreign foranea crear creada constraint compuesta como codigo clave agregar sql database foreign-keys relationship

relacionar - SQL: una clave externa hace referencia a la clave principal en una de varias tablas



llave foranea compuesta sql server (4)

Estoy trabajando en una aplicación que se utilizará como un marco extensible para otras aplicaciones.

Una de las clases fundamentales se llama Nodo, y los Nodos tienen Contenido. Las tablas SQL se ven así:

TABLE Node (NodeId int, ...., etc.)

TABLE NodeContentRelationship (NodeId int, ContentType string, ContentId int)

Corresponderá a los desarrolladores extender la aplicación para crear sus propios tipos de contenido.

Claramente, esto es malo desde el punto de vista de una base de datos de relaciones, ya que no es posible agregar una relación de clave externa a NodeContentRelationship.ContentId, a pesar de que se trata de una columna de clave externa.

Sin embargo, la solución es bastante simple y poderosa, por lo que soy reacio a cambiarla.

¿Qué piensas? ¿Me gustaría un mundo de dolor en la pista?


Cuidado con el efecto de plataforma interna .

Si intenta crear un "marco extensible" que permita a los desarrolladores almacenar datos de diferentes "tipos de contenido" y relacionarlos entre sí de forma genérica, es posible que otros ya hayan resuelto este problema .


Esto me parece una variación del diseño EAV (Entity, Attribute, Value).

Los beneficios y desventajas del diseño de EAV se han documentado ampliamente.

Aquí hay una descripción de EAV desde un punto de vista simpático:

http://ycmi.med.yale.edu/nadkarni/Introduction%20to%20EAV%20systems.htm

Y aquí está uno desde un punto de vista hostil:

http://tonyandrews.blogspot.com/2004/10/otlt-and-eav-two-big-design-mistakes.html

Tenga en cuenta la desventaja de EAV antes de comprometer miles de horas-hombre en verter datos en él. Es enormemente seductor para los programadores, pero puede convertirse en la pesadilla de un administrador de datos.


Te espera un mundo de dolor en el futuro si alguna vez quieres informar sobre estos datos. Acabas de hacer mucho más difícil escribir uniones y tal. La falta de restricciones es mala, pero el trabajo adicional necesario en las consultas es (en mi humilde opinión) peor.

Sin embargo, si desea que otros desarrolladores puedan ampliar el sistema y almacenar datos en la base de datos pero no puedan cambiar el esquema de la base de datos, es posible que no haya una opción. En ese caso, la respuesta es minimizar cuánto se almacena de esta manera. También puede acelerarlo ligeramente al reemplazar ContentType con un ContentTypeId definido en otra tabla.


¿Por qué es imposible establecer NoteContentRelationship.ContentId como una clave externa? Puede usar fácilmente un modelo de herencia relacional con una tabla. Content representa una clase base abstracta, y varias tablas AnimalContent , CarContent , etc. que representan clases derivadas.