unable transact the studio start renombrar perform not nombre management logico exclusively engine enable debugger debug datos could cambiar bases auditoria sql-server database entity-framework schema entity-attribute-value

sql-server - transact - the database could not be exclusively locked to perform the operation.



¿Cómo diseñarías tu base de datos para permitir un esquema definido por el usuario? (9)

Echa un vistazo a esta post , puedes hacerlo, pero es mucho trabajo duro :) Si el rendimiento no es una preocupación, una solución xml también podría funcionar, aunque eso también es mucho trabajo.

Si tiene que crear una aplicación como, digamos una aplicación de blog, crear el esquema de base de datos es relativamente simple. Tienes que crear algunas tablas, tblPosts, tblAttachments, tblCommets, tblBlaBla ... y eso es todo (ok, lo sé, eso es un poco simplificado, pero entiendes lo que quiero decir).

Qué sucede si tiene una aplicación en la que desea permitir que los usuarios definan partes del esquema en tiempo de ejecución . Supongamos que desea crear una aplicación donde los usuarios puedan registrar cualquier tipo de datos. Un usuario desea registrar sus horas de trabajo (tiempo de inicio, tiempo de finalización, identificación del proyecto, descripción), el siguiente quiere recopilar recetas de cocina, otros tal vez cotizaciones de acciones, el peso semanal de sus bebés, los gastos mensuales que gastaron en alimentos, los resultados de su Equipos de fútbol favoritos o cualquier cosa que puedas pensar.

¿Cómo diseñarías una base de datos para almacenar todo ese tipo de datos muy diferentes? ¿Crearía un esquema genérico que pueda contener todo tipo de datos, crearía nuevas tablas que reflejen el esquema de datos del usuario o tiene otra gran idea para hacerlo?

Si es importante: tengo que usar SQL Server / Entity Framework


En la superficie, una base de datos sin esquema o orientada a documentos como CouchDB o SimpleDB para los datos de usuario personalizados suena ideal. Pero supongo que eso no ayuda mucho si no puedes usar nada más que SQL y EF.


En lugar de volver a implementar la declaración "CREATE TABLE" de sqlservers, que fue realizada hace muchos años por un equipo de programadores que probablemente eran mejores que usted o yo, ¿por qué no trabajar en exponer a SQLSERVER de forma limitada a los usuarios? su propio esquema de forma limitada y aprovechar el poder de SQLServer para hacerlo correctamente.


Intentemoslo de nuevo.

Si desea que puedan crear su propio esquema, entonces ¿por qué no construir el esquema usando, oh, no sé, la declaración CREAR TABLA. Tiene una base de datos completa, potente y funcional que puede hacer cosas sorprendentes como definir esquemas y almacenar datos. ¿Por qué no usarlo?

Si solo ibas a hacer algunas propiedades ad-hoc, entonces seguro.

Pero si es "carta blanca, pueden hacer lo que quieran", entonces déjalos.

¿Tienen que saber SQL? Umm no. Esa es tu tarea de UIs. Su trabajo como diseñador de herramientas y aplicaciones es ocultar la implementación del usuario. Así que presenta listas de campos, líneas y flechas si quieres relaciones, etc. Lo que sea.

La gente ha estado haciendo herramientas de base de datos de "usuario final", "simple" durante años.

"¿Y si quieren agregar una columna?" Luego agregue una columna, las bases de datos hacen eso, la mayoría de las buenas por lo menos. Si no es así, cree la nueva tabla, copie los datos antiguos, suelte la antigua.

"¿Qué pasa si quieren eliminar una columna?" Véase más arriba. Si el suyo no puede eliminar columnas, elimínelo de la vista lógica del usuario para que parezca que se eliminó.

"¿Qué pasa si tienen once mil millones de filas de datos?" Luego, tienen once mil millones de filas de datos y las operaciones tardan once mil millones de veces más que si tuvieran una fila de datos. Si tienen once mil millones de filas de datos, probablemente no deberían usar su sistema para esto de todos modos.

La fascinación de "Implementar bases de datos en bases de datos" me elude.

"Tengo Oracle aquí, ¿cómo puedo ofrecer menos funciones y hacer que el usuario sea más lento?"

Caramba, me pregunto.


Iría por un modelo híbrido Entidad-Atributo-Valor, así que, al igual que la respuesta de Antony, tiene tablas EAV, pero también tiene columnas predeterminadas (y propiedades de clase) que siempre existirán.

Aquí hay un gran artículo sobre lo que estás haciendo para :)

Como comentario adicional, deseché un prototipo para este enfoque utilizando Linq2Sql en unos pocos días, y fue una solución viable. Dado que ha mencionado Entity Framework, echaría un vistazo a la versión 4 y su compatibilidad con POCO , ya que sería una buena manera de inyectar un modelo híbrido de EAV sin contaminar su esquema de EF.


No como un comentario crítico, pero puede ayudar a ahorrar algo de su tiempo para señalar que este es uno de esos problemas de tipo del Santo Grial de Don Quijote. Hay una búsqueda eterna de probablemente más de 50 años para hacer una interfaz de diseño de base de datos fácil de usar.

Los únicos casi cuasi exitosos que han ganado una tracción significativa que puedo imaginar son 1. Excel (y sus predecesores), 2. Filemaker (el original, no su sabor actual), y 3. (posiblemente, pero con dudas) Acceso . Tenga en cuenta que los dos primeros se limitan básicamente a una tabla.

Me sorprendería que nuestra sabiduría colectiva convencional te ayude a romper la barrera. Pero sería maravilloso.


No estoy familiarizado con el Entity Framework, pero me inclino por el modelo de base de datos Entity-Attribute-Value ( http://en.wikipedia.org/wiki/Entity-Attribute-Value_model ).

Entonces, en lugar de crear tablas y columnas sobre la marcha, su aplicación creará atributos (o colecciones de atributos) y luego sus usuarios finales completarán los valores.

Pero, como dije, no sé qué se supone que debe hacer Entity Framework por usted, y puede que no le permita adoptar este enfoque.


No hay forma de que puedas predecir qué tan complejos serán sus requisitos de datos. Entity-Attribute-Value es una solución típica que usan muchos programadores, pero podría ser suficiente, por ejemplo, si los datos del usuario se modelarían convencionalmente con varias tablas.

Serializaría los datos personalizados del usuario como XML o YAML o JSON o un formato semiestructurado similar, y los guardaría en un BLOB de texto.

Incluso puede crear índices invertidos para poder buscar valores específicos entre los atributos en su BLOB. Consulte http://bret.appspot.com/entry/how-friendfeed-uses-mysql (la técnica funciona en cualquier RDBMS, no solo en MySQL).

También considere usar un almacén de documentos como Solr o MongoDB . Estas tecnologías no necesitan ajustarse a las convenciones de bases de datos relacionales. Puede agregar nuevos atributos a cualquier documento en tiempo de ejecución, sin necesidad de redefinir el esquema. Pero es un compromiso: no tener un esquema significa que su aplicación no puede depender de que los documentos / filas sean similares en toda la colección.

Soy un crítico del anti-patrón Entidad-Atributo-Valor.

He escrito sobre problemas de EAV en mi libro, Antipatrones de SQL: Cómo evitar los escollos de la programación de bases de datos .

Aquí hay una respuesta SO donde enumero algunos problemas con Entity-Attribute-Value: " Tabla de productos, muchos tipos de productos, cada producto tiene muchos parámetros ".

Aquí hay un blog que publiqué el otro día con un poco más de discusión sobre los problemas de EAV: " EAV FAIL ".

Y asegúrese de leer este blog " Mala CaRMa " acerca de cómo el intento de hacer una base de datos completamente flexible casi destruye una empresa.


Simplemente les daría una copia de SQL Server Management Studio y les diría "¡vuélvete loco!" ¿Por qué reinventar una rueda dentro de una rueda?