2011-09-09 24 views
6

Tenemos un requisito en nuestro proyecto para campos personalizados. Tenemos algunos campos estándar sobre la mesa y cada cliente desea poder agregar sus propios campos personalizados. Por el momento no estoy interesado en cómo funcionará esto en la interfaz de usuario, pero quiero saber cuáles son las opciones para el almacenamiento y la recuperación de los datos. La última vez que hice algo como esto fue hace unos 10 años en VB6, así que estaría interesado en saber cuáles son las opciones para este problema en el mundo .Net de hoy.Campos personalizados en .Net y SQL Server

El proyecto está utilizando el servidor SQL para el backend, linq-to-sql para el ORM y un front end C# asp.net.

¿Cuáles son mis opciones para esto?

Gracias

+1

No sé cualquier ORM al tanto de los cambios de esquema en tiempo de ejecución –

Respuesta

11

Hay cuatro opciones principales aquí:

  • realmente cambiar el esquema (DDL) en tiempo de ejecución - sin embargo, casi ninguna ORM le va a gustar, y generalmente tiene problemas de seguridad como su " la cuenta de la aplicación normalmente no debería estar redefiniendo la base de datos; lo hace, sin embargo, evitar el efecto "plataforma interior" inherente en el siguiente uso de dos
  • un almacén de claves-valor como filas, es decir, una mesa Customer podría tener una tabla CustomerValues con pares como "dfeeNumber" = 12345 (una fila por cada clave personalizada/valor par) - pero un dolor para trabajar con (en lugar de un "obtener", esto es un "obtener" y una "lista" por entidad)
  • utilizar un solo trozo de datos (xml, json, etc.) en una sola celda CustomFields - de nuevo, no es ideal para trabajar, pero es más fácil de almacenar atómicamente con el registro principal (inconveniente: lo obliga a cargar todos los campos personalizados para leer uno solo)
  • usar una base de datos documental (ningún esquema en al l) - pero luego: no ORM

He usado los 4 en diferentes puntos. Todos 4 pueden funcionar. YMMV.

+2

1 Tenemos los dos Media que se ejecuta en vivo en nuestro código en un pequeño número de lugares - que ambos funcionan bien si la escala de ellos se mantiene en control. El último es interesante. El primero que espero nunca ver hecho, personalmente. –

1

Tengo una situación similar en el proyecto en el que estoy trabajando ahora.

  1. Olvídese de linq-to-sql cuando tiene un esquema de base de datos flexible. No hay forma de actualizar los modelos linq-a-sql sobre la marcha cuando cambia el esquema DB.

  2. Soluciones:

    • mantener un mesa adicional con la tabla de nombrar los valores pertenecen, nombre de la columna, etc valor
    • Totalmente cambiar dinámicamente el esquema de la tabla cada vez que se agrega un campo.
    • Utilice una solución NOSQL como mongoDB o Azure Table Storage. Una solución NOSQL no requiere un esquema y se puede cambiar sobre la marcha.

Este es un práctico enlace 2 de lectura:

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:10678084117056

Cuestiones relacionadas