una restricciones relacionales relacional reglas referencial paso normalizar normalizacion modelo integridad hacer entidad eliminacion ejemplos dominio diseño datos creacion como sql sql-server database database-design

sql - restricciones - ¿Cómo hago cumplir las reglas de integridad de datos en mi base de datos?



reglas de creacion y eliminacion de restricciones relacionales (10)

Estoy diseñando esta colección de clases y clases abstractas (MustInherit) ...

Diagrama de clases http://img396.imageshack.us/img396/1711/nodeclassinheritanceej0.gif

Esta es la tabla de la base de datos donde voy a almacenar todo esto ...

tabla de la base de datos http://img179.imageshack.us/img179/3237/nodetablenorootln3.gif

En lo que respecta a la base de datos de Microsoft SQL Server, esas son columnas que aceptan nulos ("Permitir nulos").

Pero realmente, eso depende de la clase almacenada allí: LinkNode, HtmlPageNode o CodePageNode.

Las reglas pueden verse así ...

tabla de reglas http://img127.imageshack.us/img127/74/datarulesha0.gif

¿Cómo hago cumplir estas reglas de integridad de datos dentro de mi base de datos?

ACTUALIZACIÓN: Con respecto a este diseño de mesa única ...

Todavía estoy tratando de concentrarme en una arquitectura final.

Inicialmente comencé con muchas tablas pequeñas con casi cero campos nullalbe.
¿Cuál es el mejor esquema de base de datos para mi navegación?

Y aprendí sobre la propiedad LINQ to SQL IsDiscriminator.
¿Cuál es la mejor manera de manejar las relaciones uno a uno en SQL?

Pero luego supe que LINQ to SQL solo admite la herencia de tablas únicas.
¿Puede una columna LINQ to SQL IsDiscriminator NO heredar?

Ahora trato de manejarlo con una colección de clases y clases abstractas.
Por favor, ayúdenme con mis clases abstractas de .NET.


¿Has probado NHibernate ? Es un producto mucho más maduro que Entity Framework. Es gratis.


No estoy tan familiarizado con SQL Server, pero sé que con Oracle puede especificar Restricciones que podría usar para hacer lo que está buscando. Sin embargo, estoy bastante seguro de que puedes definir restricciones en el servidor SQL.

EDIT: encontré este enlace que parece tener mucha información, algo larga pero puede valer la pena leer.


Parece que está intentando el patrón de herencia de tabla única , este es un patrón cubierto por la sección de patrones estructurales de objetos relacionales del libro Patterns of Enterprise Application Architecture .

Recomendaría los patrones de herencia de tabla de clase o herencia de tabla concreta si desea aplicar integridad de datos mediante restricciones de tabla SQL.

Aunque no sería mi primera sugerencia, aún podría usar la herencia de tabla única y simplemente aplicar las restricciones mediante un procedimiento almacenado.


Personalmente, siempre insisto en poner código de integridad de datos en la tabla, ya sea a través de un desencadenante o una restricción de verificación. El motivo es que no puede garantizar que solo la interfaz de usuario actualice los registros de inserción o eliminación. Tampoco se puede garantizar que alguien no escriba una segunda sp para sortear las restricciones en la versión original sin entender las reglas de integridad de datos reales o incluso escribirlo porque no tiene conocimiento de la existencia de sp con las reglas. Las tablas a menudo se ven afectadas por paquetes DTS o SSIS, consultas dinámicas desde la interfaz del usuario o a través del Analizador de consultas o la ventana de consultas, o incluso por trabajos programados que ejecutan código. Si no coloca el código de integridad de datos a nivel de tabla, tarde o temprano sus datos no tendrán integridad.


Probablemente no sea la respuesta que desea escuchar, pero la mejor manera de evitar inconsistencias lógicas es que realmente desea ver la normalización de la base de datos.


Puede configurar algunos activadores de inserción / actualización . Simplemente verifique si estos campos son nulos o notnull , y rechace la operación de insertar / actualizar si es necesario. Esta es una buena solución si desea almacenar todos los datos en la misma tabla.

También puede crear una tabla única para cada clase .


SQL Server no sabe nada sobre tus clases. Creo que tendrá que hacer cumplir esto mediante el uso de una clase de fábrica que construye / deconstruye todos estos para usted y se asegura de que está pasando los valores correctos, dependiendo del tipo.

Técnicamente esto no es "hacer cumplir las reglas en la base de datos", pero no creo que esto se pueda hacer en una sola tabla. Los campos aceptan nulos o no.

Otra idea podría ser explorar las funciones SQL y los procedimientos almacenados que hacen lo mismo. PERO no puede hacer que un campo sea NOT NULL para un registro y NULL para el siguiente. Ese es su trabajo Business Layer / Factory.


Tener una tabla única para cada tipo de nodo.

¿Por qué no solo hacer que la clase que está construyendo imponga la integridad de datos para su propio tipo?

EDITAR

En ese caso, puede a) utilizar restricciones lógicas (ver a continuación) o b) procedimientos almacenados para hacer inserciones / ediciones (una buena idea independientemente) o c) de nuevo, solo hacer que la clase aplique la integridad de los datos.

Una mezcla de C & B sería el curso de los eventos que tomo. Tendría procedimientos únicos almacenados para agregar / editar para cada tipo de nodo (es decir, Insert_Update_NodeType), así como también hacer que la clase realice la validación de datos antes de guardar los datos.


Use las restricciones CHECK en la tabla. Estos le permiten usar cualquier tipo de lógica booleana (incluso en otros valores en la tabla) para permitir / rechazar los datos.

Desde el sitio de Books Online :

Puede crear una restricción CHECK con cualquier expresión lógica (Boolean) que devuelva TRUE o FALSE en función de los operadores lógicos. Para el ejemplo anterior, la expresión lógica es: salario> = 15000 Y salario <= 100000.


La respuesta de Stephen es la mejor. Pero si DEBE, podría agregar una restricción de verificación a la columna HtmlOrCode y a las otras columnas que deben cambiar.