¿Diseño de DB para usar subtipo o no?

La database que estoy diseñando tiene 3 tablas principales: BOOKS , ARTICLES , NOTES .
Cada libro o artículo puede tener varias notas, mi layout original era así, lo que significa que tanto las notas en los libros como las notas en los artículos van a la tabla de "notas". Aquí están las columnas para la tabla NOTES :

  • note_id
  • note_type
  • note_type_id
  • note_content

NOTE_TYPE puede ser 'libro' o 'artículo'; NOTE_TYPE_ID es el FK de un book_id si el note_type es 'book' O una ID de artículo si el note_type es 'article'.

Ahora empiezo a preguntarme si ese es el layout correcto (o mejor normalizado). Un enfoque alternativo es usar 5 tablas

books / articles / notes / book_notes / article_notes

De esta forma puedo save notas de libros y notas de artículos por separado, las columnas son como

'notes' {note_id, note_content} 'book_notes' {book_id, note_id} 'article_notes' {articel_id, note_id}

¿Cuál es correcto o mejor?

Tal vez un enfoque un poco diferente: el subtipo / subtipo generalmente se usa cuando tiene columnas muy específicas para cada subtipo, como en el supertipo de persona con subtypes de paciente y doctor. La persona tiene todos los datos comunes a las personas y el Paciente y el Doctor tienen columnas muy específicas para cada uno. En este ejemplo, tus book_notes y article_notes no son tan diferentes.
Preferiría considerar tener una publicación de supertipo con Libro y Artículo como subtypes. Entonces puede tener solo una tabla de notas con FK para publicación. Teniendo en count que un número PK en Publicación es el mismo número que [PK, FK] de Libro (Artículo) puede hacer combinaciones con notas en Publicación, Libro o Artículo. De esta manera, simplemente puede agregar otra publicación, como Revista agregando una nueva tabla sub-clasificada y sin cambiar nada con respecto a la Nota.

Por ejemplo:

 TABLE Publication (ID (PK), Title, ...more columns common to any publication) TABLE Book (ID (PK) = FK to Publication, ISBN, ... more columns specific to books only) TABLE Article (ID (PK) = FK to Publication, ... more columns specific to articles only) TABLE Note (ID, PublicationID FK to Publication, NoteText) 

La key principal para la tabla Libro y Artículo también sirve como key externa para la Publicación.

Ahora si agregamos otra publicación, Revista:

 TABLE Magazine (ID (PK) = FK to Publication, ... more columns specific to magazines only) 

No tenemos que modificar Note de ninguna manera, y hemos agregado columnas específicas solo para revistas.

pub_model_01

Desde una cierta perspectiva, es mucho mejor a largo ploop usar

books / book_notes / articles / notas del artículo

como un principio de layout para su database.

Cuando considera copys de security, manipulación de datos y portabilidad de datos a lo largo del time, tener los attributes de una sola entidad en su propia tabla comienza a dar sus frutos.

Ninguno de los dos es realmente "mejor" en términos absolutos, depende del context. La gente está acostumbrada a poner cualquier cosa en un armario que se ajuste, los diseñadores de bases de datos académicas tienden a crear un armario por cada cepillo de dientes.

En su context, puede decidir que la sobrecarga adicional de sql insert / seleccionar / actualizar / eliminar para tablas de 3 notas en lugar de solo una no lo vale. A más largo ploop, si inicialmente elige el layout de "1 tabla de notas" y luego decide que no le gusta, dividirlo en 3 no es como reescribir la guerra y la paz.

NOTE_TYPE puede ser 'libro' o 'artículo'; NOTE_TYPE_ID es el FK de un book_id SI el tipo de nota es 'book' O una ID de artículo si el tipo de nota es 'article'.

Esta relación se denomina arco cuando se representa en un model de datos lógicos.

Está bien si no prevé ninguna duplicación de notas. No solo entre libros, sino también artículos.

Depende de lo que quieras hacer con el subtipo. En sus tablas principales, los libros y artículos parecen subtypes de "publicaciones". Sin embargo, no hay una tabla para "publicaciones". ¿Es eso porque no necesita search publicaciones, o porque no pensó en términos de "generalización-especialización de models relacionales"? Si busca esta frase en la web, verá algunos buenos artículos sobre el tema.

Suponiendo que no necesita una tabla de "publicaciones" generalizadas, entonces probablemente tampoco necesite una tabla general de "notas". ¿Va a search notas donde no importa a qué tipo de publicación se refiere la nota? ¿Cuánto time pasará antes de que desee agregar un tercer o cuarto tipo de publicación?

Todos estos tienen un impacto sobre qué layout es "conceptualmente mejor". Si quieres algo conceptualmente mejor, entonces estás optimizando, ya sea que te des count o no. Es posible que esté optimizando con respecto a una medida de bondad diferente de la velocidad o la simplicidad.

Parece que tu enfoque principal debería estar en Notes . Dada esa statement, crearía una estructura de datos SuperTypeSubType .

Las notas contendrían todo lo que hace que una nota sea única (SuperType) y solo aquellos elementos de Libros y artículos que son comunes a todos (SubType).

Nota SuperType Fields:

  • NoteId
  • NoteContent
  • NoteTypeId (1 = Libro 2 = Artículo)

Campos de subtipo común:

  • Título
  • Autor
  • Fecha

Reservar campos únicos: (NoteTypeId = 1)

  • ISBN
  • Editor
  • Precio
  • Etc

Campos únicos del artículo: (NoteTypeId = 2)

  • Nosotros mordemos
  • Derechos de distribución
  • Etc

Esto le permite a peolpe search o explorar todas las notas por contenido, tipo, título, autor y date. Luego, para get más información, vaya a los detalles del subtipo .

Esto también permite el crecimiento para que pueda agregar fácilmente otros subtypes según sea necesario. Por ejemplo, Blogs (NoteTypeId = 3), FaceBookPages (NoteTypeId = 4), etc.