2009-09-19 20 views
5

Tengo 4 subclases: Video, Image, Note y Form. Cada uno contiene diferentes tipos de datos. Por ejemplo, la clase Image contiene una ruta al archivo de imagen en el disco y las propiedades de la imagen, y la clase Form contiene los valores del campo de formulario. El elemento común entre cada elemento, sin embargo, es las coordenadas GPS y sentido, por lo que tienen la siguiente clase base abstracta:modelar una clase base y subclases abstractas en una base de datos

public abstract class Content 
{ 
    public float? Latitude { get; set; } 
    public float? Longitude { get; set; } 
    public float? Heading { get; set; } 
} 

Sin embargo, donde consigo nebulosa está en la forma de modelar esto en una base de datos. Actualmente tengo una tabla llamada Events (para el ejemplo, digamos que un evento es una fiesta de cumpleaños) y 4 tablas (Videos, Images, Notes y Forms). Cada tabla tiene una clave externa que enlaza a la clave principal Events '.

Usando LINQ-to-SQL, obtengo 5 clases para cada tabla. Esto está bien si solo quiero un tipo de datos, por ejemplo Event.Images, pero lo que quiero hacer es contar el número total de 'contenidos' que tiene Event y obtener las coordenadas GPS. Puedo aumentar el conteo de manera fácil simplemente usando Event.Images.Count() + Event.Videos.Count() + ..., pero no puedo hacer lo mismo con las coordenadas GPS. ¿Hay alguna manera de que pueda modelar la base de datos para que pueda usar una clase base para cada elemento y aún así poder obtener el elemento fuertemente tipado cuando necesito ver sus datos?

Respuesta

8

Hay tres patrones diferentes para este documentados en los patrones de arquitectura de aplicación empresarial, cada uno con diferentes ventajas y desventajas de Martin Fowler:

+0

Gracias por los enlaces. No proporcionan exactamente una buena descripción sobre cómo usar los modelos, pero me da un punto de partida para investigar más. Personalmente, siempre he pensado que el modelo de tabla única era una mala idea porque significa que si agrega una nueva subclase, tendrá que agregar nuevas columnas para sus datos, y eso puede aumentar a un tamaño no deseado, aunque para aplicaciones más pequeñas puedo ver los méritos de usarlo. –

+0

Ya, hay compensaciones definidas. Solo depende de la probabilidad de agregar nuevos tipos. Si no es probable, puede ser mejor evitar atravesar varias tablas y usar la tabla única. Si es posible, uno de los otros patrones. Y, sí, esos enlaces son bastante escasos porque quieren que compres el libro :-) Es un buen libro, vale la pena, creo. – SingleShot

1

Eso es una forma de hacerlo.

En términos generales, existen otras dos maneras:

  • tabla por subclase: En lugar de tratar de compartir los baseclass en la base de datos, basta con crear tablas separadas para cada uno.

  • tabla por jerarquía: coloque un superconjunto de todos los campos en una tabla, así como una columna "discriminador", y guárdelos en un solo lugar.

de averiguar lo que es correcto, pensar en los patrones de uso:

  • si los trata por lo general de forma independiente, y la consulta de forma independiente, mesas separadas son una buena manera de vaya-- lo que sea tener o tabla por subclase.
  • si éstos son tratados como colecciones heterogéneas, por lo que quieren ver como tales, una sola tabla puede ser más fácil

también ver lo que su herramienta es compatible con la mayoría de forma natural. Todos ellos trabajan.

+0

Gracias por la respuesta. Resulta que necesito cambiar todo el modelo de dominio de todos modos, así que mi problema se solucionó, por así decirlo. –

-2

En realidad, esta pregunta exacta se hace una gran cantidad, y ha sido answered many times. Probablemente no ha buscado utilizando la terminología de la base de datos.

El problema es aplicar la terminología y el pensamiento OO en un área temática no objeto; hacer una tarea ordinaria simple muy compleja y limitada.

los libros de Martin Fowler y Scott Ambler de no valen un dólar por la gran cantidad de ellos, detalles en this answer, a partir de la 11 Dic 10 entrada.

+6

-1, hice esta pregunta el 2009-09-19, antes de que se crearan los artículos que enlazó. Su respuesta no es en absoluto una respuesta, sino insultos poco disimulados contra mí y dos individuos respetados en la industria. –

+2

@Daniel. Este hilo sigue apareciendo, en otros hilos (actuales), que es cómo lo encontré. Lo siento, no me di cuenta que era de 2009. No hay insulto para ti. Fowler & Ambler tiene mucho por lo que responder. Me complace responder a las especificaciones, pero no es posible responder a las generalidades de Fowler/Ambler o sus sentimientos (por ejemplo, ¿cuál es el "insulto"?) – PerformanceDBA

Cuestiones relacionadas