2011-01-28 13 views
34

Acabo de leer los argumentos de @DownDBA re: 6NF y E-A-V. Estoy intrigado. Anteriormente había sido escéptico de 6NF, ya que se presentó como "simplemente" pegar algunas columnas de marca de tiempo en las tablas.Me gustaría entender 6NF con un ejemplo

Siempre he trabajado con un diccionario de datos y no necesito convencerme para que use uno o para generar código SQL. Así que espero una respuesta que requiera un diccionario (o catálogo) que se utiliza para generar código.

Así que me gustaría saber cómo 6NF se ocuparía de un extremadamente simple ejemplo. Una tabla de artículos, descripciones y precios. Los precios cambian con el tiempo.

De todos modos, ¿cómo se ve la tabla Items cuando se convierte a 6NF? ¿Cuál es la "explosión de tablas"? que pasa aqui?

Si el ejemplo no funciona con una tabla así de simple, siéntase libre de agregar lo que sea necesario para transmitir el punto.

Respuesta

27

En pocas palabras, 6NF significa que cada relación consiste en una clave candidata más no más de otro atributo (clave o no clave). Para tomar su ejemplo, si un "elemento" se identifica mediante un CódigoProducto y los otros atributos son descripción y el precio a continuación un esquema 6NF constaría de dos relaciones (* indica la clave en cada uno):

ItemDesc {ProductCode*, Description} 
ItemPrice {ProductCode*, Price} 

Este es potencialmente un enfoque muy flexible porque minimiza las dependencias. Esa es también su principal desventaja, especialmente en una base de datos SQL. SQL hace que sea difícil o imposible aplicar muchas restricciones de tablas múltiples. Con el esquema anterior, en la mayoría de los casos no será posible hacer cumplir una regla comercial de que cada producto siempre debe tener una descripción Y un precio. Del mismo modo, es posible que no pueda aplicar algunas claves compuestas que deberían aplicarse (porque sus atributos podrían dividirse en varias tablas).

Al considerar 6NF, tiene que sopesar qué dependencias y reglas de integridad son importantes para usted. En muchos casos, puede resultarle más práctico y útil adherirse a 5NF y no normalizar más allá de eso.

+5

"6NF significa que cada relación consiste en una clave candidata más no más de otro atributo (no clave)". ¿Me puede dar una referencia a esta definición? – shababhsiddique

+4

Pago y envío "Diseño e implementación de bases de datos relacionales: Jan Harrington, 3ª edición, Página Nº125". (* El resultado es tablas que no se pueden descomponer más; en la mayoría de los casos, las tablas incluyen la clave principal y -key atributo. *) – Shinchan

32

De hecho, comencé a poner una respuesta juntos, pero tuve complicaciones, porque (bastante comprensiblemente) quiero un ejemplo simple. El problema es múltiple.

En primer lugar, no tengo una buena idea de su nivel real de experiencia en bases de datos relacionales y 5NF; No tengo un punto de partida para abordar y luego discutir los detalles de 6NF,

En segundo lugar, al igual que cualquiera de los otros NF, es variado. Puedes apenas pisarlo; puedes implementar 6NF para las tablas de certan; puedes ir al máximo en cada mesa, etc. Seguro que hay una explosión de tablas, pero luego lo normalizas y matas la explosión; esa es una implementación avanzada o madura de 6NF. No sirve de nada proporcionar los niveles completos o parciales de 6NF, cuando está pidiendo el ejemplo más sencillo y directo.

Confío en que comprenda que algunas tablas pueden estar "en 5NF" mientras que otras están "en 6NF".

Así que puse uno para usted. Pero incluso eso necesita una explicación.

Ahora SQL apenas admite 5NF, no admite 6NF en absoluto (creo que dportas dice lo mismo en otras palabras). Ahora implemento 6NF en un nivel profundo, por razones de rendimiento, pivoteo simplificado (de tablas enteras, todas las columnas, no la función PIVOT tonta en MS), acceso en columnas, etc.Para eso necesita un catálogo completo, que es una extensión del catálogo SQL, para admitir el 6NF que SQL no admite, y mantener la integridad de los datos y las Reglas comerciales. Entonces, realmente no desea implementar 6NF por diversión, solo lo hace si tiene una necesidad, porque tiene que implementar un catálogo. (Esto es lo que la multitud EAV no lo hacen, y esta es la razón por la mayoría de los sistemas de EAV tienen problemas de integridad de datos. La mayoría de ellos no utilizar el declarativa Referencial & integridad de los datos que SQL tiene.)

Pero la mayoría de la gente quienes implementan 6NF no implementan el nivel más profundo, con un catálogo completo. Tienen necesidades más simples y, por lo tanto, implementan un nivel más bajo de 6NF. Entonces, tomemos eso, para proporcionar un ejemplo simple para usted. Comencemos con una tabla de Producto ordinaria que se declara en 5NF (y no discutamos sobre qué es 5NF). La empresa vende diferentes tipos de productos, la mitad de las columnas son obligatorias y la otra mitad son opcionales, lo que significa que, según el tipo de producto, ciertas columnas pueden ser nulas. Si bien pueden haber hecho un buen trabajo con la base de datos, los nulos son ahora un gran problema: las columnas que deben ser no nulas para ciertos tipos de productos son nulas, porque la declaración indica NULL y su código de aplicación es tan bueno como el siguiente .

Así que deciden ir con 6NF para solucionar ese problema, porque el subtítulo de 6NF establece que elimina el problema nulo. La sexta forma normal es la forma normal irreductible, no habrá más NF después de esto, porque los datos no se pueden normalizar más. Las filas se han normalizado al máximo grado. La definición de 6NF es:

una tabla está en 6NF cuando la fila contiene la clave principal y, como máximo, un atributo.

Tenga en cuenta que según esa definición, millones de tablas en todo el planeta ya están en 6NF, sin tener esa intención. P.ej. tablas de Referencia o Búsqueda típicas, con solo un PK y una Descripción.

Derecha. Bueno, nuestros amigos miran su tabla Producto, que tiene ocho atributos que no son clave, de modo que si crean la tabla Producto 6NF, tendrán ocho tablas de subproductos. Luego está el problema de que algunas columnas son claves externas a otras tablas, y eso lleva a más complicaciones. Y notan el hecho de que SQL no es compatible con lo que están haciendo, y tienen que crear un pequeño catálogo. Ocho tablas son correctas, pero no sensatas. Su propósito era deshacerse de Nulls, no escribir un pequeño subsytem alrededor de cada mesa.

Simple 6NF Example

Los lectores que no están familiarizados con la Norma para el modelado de bases de datos relacionales pueden encontrar IDEF1X Notation útil para la interpretación de los símbolos en el ejemplo.

Por lo general, la Tabla de productos conserva todas las columnas obligatorias, especialmente las FK, y cada columna Opcional, cada columna Nullable, se coloca en una tabla de subproductos separada. Esa es la forma más simple que he visto. Cinco mesas en lugar de ocho. En el Modelo, las cuatro tablas de subproductos están "en 6NF"; la tabla principal del Producto está "en 5NF".

Ahora realmente no necesitamos todos los segmentos de código que SELECCIONA del Producto para tener que averiguar qué columnas debe construir, en función del Tipo de Producto, etc., entonces proporcionamos una Vista, que esencialmente proporciona la "vista" 5NF de el clúster de la tabla Producto.

Lo siguiente que necesitamos son los rudimentos básicos de una extensión del catálogo SQL, para asegurarnos de que las reglas (integridad de datos) para los diversos tipos de productos se mantienen en un lugar, en la base de datos y no dependen en el código de la aplicación. El catálogo más simple que puedes salirte con la tuya. Eso se elimina de ProductType, por lo que ProductType ahora forma parte de esa Metadata. Usted puede implementar esa estructura simple sin un catálogo, pero yo no lo recomendaría.

actualización

Es importante señalar que implemento todos reglas de negocio en la base de datos. De lo contrario, no es una base de datos (la noción de reglas de implementación "en el código de la aplicación" es extremadamente graciosa, especialmente hoy en día, cuando tenemos floristas trabajando como "desarrolladores"). Por lo tanto, todas las reglas, etc. se implementan antes que nada como declaraciones SQL, restricciones CHECK, funciones, etc. Esto conserva toda la integridad referencial declarativa y la integridad declarativa de los datos. La extensión del catálogo SQL cubre el área en la que SQL no tiene declaraciones para, y luego se implementan como SQL. Al ser un buen diccionario de datos, hace mucho más. P.ej. No escribo Vistas cada vez que cambio las tablas o agregue o cambie columnas o sus características, se crean directamente desde el catálogo + extensión usando un generador de código simple.

Una nota más muy importante. No puede implementar 6NF (o EAV correctamente, para el caso), sin completar un ejercicio de Normalización completo y fiel, a 5NF. El problema que veo en cada sitio es que no tienen un verdadero estado de 5NF, tienen una mezcolanza de normalización parcial o ninguna normalización, pero están muy apegados a eso. Crear 6NF o EAV a partir de eso es un desastre. Crear EAV o 6NF a partir de ese sin todas las reglas comerciales implementadas en el SQL declarativo es un desastre nuclear, que arde durante años. Tienes lo que pagas.

Fin de la actualización.

Finalmente, sí, hay al menos cuatro niveles adicionales de normalización (la normalización es un principio, no una mera referencia a un formulario normal), que se pueden aplicar a ese clúster simple de productos 6NF, proporcionando más control, menos tablas , etc. Cuanto más nos adentramos, más extenso es el catálogo. Y niveles más altos de rendimiento. Cuando esté listo, solo pregunte, ya he erigido los modelos y publicado detalles en otras respuestas.

+0

gracias por los detalles. –

+1

@Ken. El gusto es mio. Cuando esté listo para niveles más profundos de 6NF, solo pregunte o lea mis otras respuestas. En caso de que no lo sepa, puede desmarcar una respuesta y marcar otra respuesta. – PerformanceDBA

+2

"Tenga en cuenta que según esa definición, millones de tablas en todo el planeta ya están en 6NF, sin haber tenido esa intención". Buen punto, por ejemplo todas las tablas de "todas las teclas" están en 6NF. – onedaywhen

6

que había sido previamente escéptico de 6NF ya que se presenta como "simplemente" pegando algunas columnas de fecha y hora en tablas.

No estoy muy seguro de dónde viene este error aparente. ¿Quizás el hecho de que 6NF se introdujo para el libro "Datos temporales y el modo relacional" por fecha, Darwen y Lorentzos? De todos modos, espero que las otras respuestas aquí hayan aclarado que 6NF no está limitado a las bases de datos temporales.

Lo que quería decir es que, aunque 6NF es "académicamente respetable" y siempre alcanzable, puede no conducir necesariamente al diseño óptimo en todos los casos (y no solo al considerar la implementación con SQL). Incluso los descubridores y defensores antes mencionados de 6NF parecen estar de acuerdo, por ejemplo.

Chris Date: "Para fines prácticos, cumpla con 5NF (y 6 NF)."

Hugh Darwen: "la descomposición 6NF torno Fecha [! No la persona] sería una exageración ... un diseño óptimo para el club de fútbol es ... 5-y-un-poco-NF"

!

Hugh Darwen: "estamos en 5NF pero no en 6NF, y de nuevo 5NF es suficiente" (varios ejemplos similares)

por otra parte, también puedo encontrar pruebas de lo contrario:.

Chris Date: "Darwen y Los dos he sentido por algún tiempo que todos los relvars de base deberían estar en 6NF ".

En una nota práctica, recientemente extendí el esquema de SQL de uno de nuestros productos para agregar una característica menor. Adopté un 6NF para evitar columnas con nulos y terminé con seis nuevas tablas donde la mayoría (¿todos?) De mis colegas habrían usado una tabla (o tal vez ampliado una tabla existente) con columnas con nulos. A pesar de que me probar varios 'ayudante' procedimientos almacenados y un 'desnormalizado' VIEW con INSTEAD OF desencadenantes, cada codificador que ha tenido que trabajar con esta función a nivel de SQL ha salido de su manera de maldícemelo :)

+0

1) esto no responde a la pregunta 2) Esas citas sacadas de contexto (una necesita leer la página, si no el capítulo) se pueden usar para probar algo, incluso lo contrario de lo que está tratando de respaldar. Por lo tanto, no pueden tomarse en serio 3) está listo para más colegas de alto nivel. – PerformanceDBA

+1

@PerformanceDBA: 1) seguro que sí: específicamente la parte que dice: "siéntase libre de agregar lo que sea necesario para transmitir el mensaje". Me parece muy interesante que los principales defensores de 6NF insinúen que "5NF a menudo es lo suficientemente bueno". 2) De acuerdo, ¡lee todo! 3) "Estás listo para más colegas de alto nivel" - Me siento halagado :) ¿Pero dónde encontrar ...? – onedaywhen

3

Estos chicos lo tienen abajo: Anchor Modeling. Excelentes trabajos académicos sobre el tema, combinados con ejemplos prácticos. Sus escritos finalmente me llevaron al límite para considerar construir un DW en 6nf en un próximo proyecto. El trabajo POC que he hecho ha validado (al menos para mí) que los enormes beneficios de 6nf no superan los costos.

+0

+1 por mencionar el sitio. Había leído sus cosas previamente. No estoy seguro de estar de acuerdo con su premisa/filosofía, pero está bien pensado y me da algo en qué pensar. –

Cuestiones relacionadas