Tenemos una tabla base que define partes y contiene información como número de parte, descripción, precio, peso, etc. También tenemos aproximadamente 400 tablas que hacen referencia a la tabla base y proporcionan información adicional sobre las partes en función de su tipo / categoría.
Comenzamos utilizando restricciones de clave externa para que una parte no se pueda eliminar de la tabla base si se hace referencia a ella en una de las tablas específicas de 400 partes, pero rápidamente alcanzamos el máximo de 253 claves externas recomendadas para SQL Server 2005.
¿Hay alguna alternativa a las claves externas en esta situación que garantice la integridad de los datos? No hemos visto problemas de rendimiento al acceder a los datos, pero la actualización de una parte existente en la tabla base fallará ya que el plan de consulta es demasiado complejo.
fuente
Respuestas:
Si hay alguna forma de agrupar partes, es posible que pueda introducir tablas intermedias como solución alternativa. Esto no funcionara.
Pero algo así podría ser.
Sin embargo, me gustaría echar un vistazo a tu DDL antes de recomendarlo . Y si haces esto, no comiences a tirar números de identificación por todas partes. Debería poder unir "Tabla 400" directamente a "Piezas" sin incluir "Piezas GreenBlueIndigoViolet".
fuente
Si realmente no puede combinar tablas, ¿por qué no crear una
TRIGGER
en la tabla base para evitar su eliminación?Comience aquí: http://msdn.microsoft.com/en-us/library/ms189799(v=sql.90).aspx
fuente
Reemplace las más de 400 mesas con una. Solo necesita 3 campos (+1 autonumber o cualquier clave principal si lo desea, no tiene que tenerlo, puede formarlo a partir de los otros campos)
ID del artículo Valor de atributo
Entonces, donde en sus otras tablas cada campo representa un atributo, en esta tabla sus atributos están todos en un campo. Tendrías algo como esto
Valor de atributo de ID de artículo
Calcetín Material Lana
Calcetín Color Rojo
Peso del calcetín 20 libras
Alien Planet Alpha Centauri
Alien Color Púrpura
Alien Friendly No
Los ItemID probablemente deberían ser un número / alfanumérico de c. Luego, solo tiene una tabla de referencias cruzadas con Atributos como encabezados de columna cuando sea necesario para generar las tablas que desee. Esto también permite mejores consultas para cosas como "Muéstrame todos los artículos que son de Alpha Centauri" que podrían devolverte el Alien y también el fragmento de Meteorito que contenía la plaga que aniquila a la humanidad (está llegando .....)
La optimización puede ser complicada dependiendo de cuántos registros haya, pero es una forma mucho mejor de diseñar esto. Hice lo mismo para una base de datos que contenía un montón de recetas (10k +) que tenían pocas superposiciones. Funcionó bien en ese caso. Realmente no tuve problemas de velocidad. El tuyo puede ser más difícil dependiendo de con cuántos estés lidiando.
fuente
Entity
,Entity_Attribute
,Entity_Attribute_Value
). Si desea agregar un tratamiento semi-adecuado para diferentes tipos de datos y restricciones referenciales, necesitará más.