2012-05-15 22 views
9

Estoy diseñando una base de datos que maneja los usuarios, cuentas y proyectos con las siguientes relaciones y restricciones:Descomposición de una relación ternaria en relaciones binarias

  • una cuenta tiene muchos usuarios
  • un usuario pertenece a muchas cuentas
  • una cuenta tiene muchos proyectos
  • Un proyecto pertenece a única una cuenta
  • Un usuario colabora en muchos proje cts (nota redundante: cada uno de ellos pertenece a su propia cuenta).

En otras palabras, un usuario puede colaborar en muchos proyectos de la misma cuenta. Pero dado que un usuario puede pertenecer a varias cuentas, un usuario puede colaborar en muchos proyectos de varias cuentas. Esto me lleva a una ternaria colabora relación:

enter image description here

Después de leer un par de artículos sobre la conversión de las relaciones ternarias en relaciones binarias que ocurrió con las siguientes relaciones equivalentes:

enter image description here

Dos preguntas surgen aquí:

  1. ¿Es correcta esta conversión? He descubierto que tengo que agregar comprobaciones adicionales a nivel de aplicación para manejar las inserciones. Por ejemplo, antes de agregar un nuevo (User,Project), debo verificar que el usuario pertenece a la misma cuenta a la que pertenece el proyecto.

  2. ¿Es realmente necesario establecer la relación entre Account y User? Una vez que se ha agregado la relación entre User y Project, ¿no podríamos conocer la cuenta a la que pertenece un usuario al acceder al proyecto?

Thanks !!

Respuesta

11

¿Es correcta esta conversión?

Si por "correcto" quiere decir "equivalente", entonces no.

No hay nada que lo impida al conectar el proyecto y la cuenta sin conectando un usuario (etc ...), lo que no sería posible en una relación ternaria real.

¿Es realmente necesario establecer la relación entre Cuenta y Usuario? ... ¿no podríamos saber la cuenta a la que pertenece un usuario al acceder al proyecto?

En realidad, solo sabríamos qué cuentas son "candidatas" para conectar con el usuario, pero no tendríamos una buena manera de elegir una.

El problema real con este esquema es que le permite conectar al usuario a una cuenta no relacionada con ninguno de los proyectos del usuario.


En mi opinión, si necesita una relación ternaria, solo tiene que seguir y representarla directamente en el modelo físico. Si entiendo sus necesidades correctamente, esto sería algo como esto:

enter image description here

Nota cómo AccountId está fuera Collaboration PK. Esto significa que cada combinación de proyecto/usuario debe estar conectada exactamente a una cuenta (una combinación de diferente aún se puede conectar a una cuenta diferente).

+0

Me gusta su enfoque, pero mucha gente recomienda la descomposición por defecto, de ahí mi pregunta. – elitalon

+0

¿Quién recomienda descomponerse por defecto? –

+2

@elitalon Nunca haga algo solo porque alguien (¡incluido yo!) Le diga que lo haga. Comprenda siempre qué está haciendo y ** por qué **; de lo contrario, estará [programando por coincidencia] (http://pragprog.com/the-pragmatic-programmer/extracts/coincidence). –