É ótimo que você dedique algum tempo para entender, classificar e modelar os dados com os quais está lidando, pois, a partir de minha experiência pessoal, tudo isso torna todo o processo de desenvolvimento mais fácil e flexível para futuras mudanças. E tenho certeza de que você também já está ciente disso.
Modelo de dados preliminar e regras de negócios assumidas
Definei uma lista de regras de negócios que assumi após ler sua pergunta e examinar atentamente seus diagramas, a fim de descrever minha compreensão de suas especificações. Depois de definir essa lista, derivei um modelo de dados IDEF1X [1] que decidi enviar como documento .PDF em uma plataforma externa (Dropbox), pois, devido ao seu formato, esse modelo de dados não se encaixa bem em uma imagem incorporada. Esses dois instrumentos serão úteis como referência para alguns pontos importantes que enumero abaixo na seção intitulada Aspectos a serem resolvidos, a fim de seguir adiante .
Primeiro, aqui está o…
Como é apenas isso, preliminar, considere-o como um meio para nos ajudar a alcançar o modelo de dados final desejado.
Regras de negócios assumidas
O referido modelo de dados preliminar foi derivado de uma coleção de regras de negócios (inferidas da sua pergunta) que enumerarei da seguinte maneira:
Organizações e perfis
Observe que Profile
atualmente é entendido como sinônimo Person
.
- An
Organization
é amigo de um para muitos Profiles
.
- An
Organization
é amigo de um para muitos Organizations
.
- An
Organization
é membro de um para muitos Organizations
.
- A
Profile
é um membro de um para muitosOrganizations
.
- A
Profile
é amigo de um para muitos Profiles
.
- A
Profile
é um membro de um para muitos Profiles
.
Locais e endereços
- Um
Organization
é dono de um para muitos Locations
.
- A
Location
é classificado por um para muitos LocationTypes
( apenas um em um determinado momento).
- Um
Location
pode ter um-para-muitos Addresses
( um Physical
, um para Shipping
, um para Billing
, ou um que serve a propósitos todos disseram, ou um que combina dois propósitos e outra que serve apenas um deles).
Um Address
pode ser mantido por um para muitos Profiles
ou, em outras palavras, um Profile
mantém um para muitos Addresses
.
Um específico Address
pode ser utilizado por um-para-muitos Profiles
(servindo como Physical
para um Profile
, a ser utilizado para Billing
por um diferente , etc.). Então, um Address
funciona de maneira semelhante para Locations
e Profiles
.
- Assim, um indivíduo
Address
pode ser, ao mesmo tempo , de tipo Physical
, Shipping
e Billing
.
Locais e funções
- A
Location
abre um para muitos Roles
.
- A
Role
pode ser realizado em um para muitos Locations
.
- A
Profile
(uma vez definido como Member
um Organization
) pode executar um para muitos Roles
, em um para muitos Locations
(mas apenas um específico Role
em cada Location
um em um momento específico, ou seja, nunca dois ou mais Roles
ao mesmo tempo) )
Aspectos a serem resolvidos para seguir em frente
Para continuar avançando na resolução do seu modelo de dados, aqui está uma lista de pontos relevantes que, uma vez elaborados, ajudarão a alcançar esse objetivo:
Supus que o termo Profile
em seu contexto tenha um significado semelhante (ou o mesmo) ao de Person
, mas poderia ser um pouco diferente. Dessa forma, você diria que, no seu cenário, as entidades Organization
e Person
são subtipos de Profile
?
Pode um Profile
(ou Person
) possuir um para muitos EmailAddresses
, ou é Profile
(ou Person
) fixo para exatamente um EmailAddress
?
Deseja fornecer a possibilidade de um Organization
contato ser contatado por meio de Telephone
e Email
, ou você deseja restringir isso para apenas Profile
(ou Person
)?
Eu suponho que a Location
seja fixo exatamente para umAddress
do tipo Physical
, isso está correto?
É possível que um Location
seja compartilhado por um para muitos diferentes Organizations
ou , caso contrário, um Location
possa pertencer a apenas um Organization
?
Você declarou por meio de comentários que o fato de ser a Member
e a Friend
é o mesmo. Como você pode ver no meu modelo de dados preliminares proposto, eu segui suas especificações originais e descrevi todas as combinações possíveis de associação e amizade entre Organization
e Profile
(ou Person
) em diferentes entidades, pois acho que isso pode ser útil no esforço de definir o melhor possível estrutura para essa parte do seu cenário. Neste sentido:
- Suponho que a declaração
an Organization is a Member of another Organization
tenha efeitos diferentes dos da declaração a Profile (or Person) is a Member of an Organization
chamada entidade Location
.
- Como você pode ver no modelo de dados, acho que o
Role
de Owner
é válido apenas para um Organization
e, para mim, o válido Roles
para um Profile
(ou Person
), dentro de um Location
are Admin
e Member
. O que você acha disso tudo? Como você está em contato direto com as regras de negócios que se aplicam à sua situação, é necessário me informar se minhas suposições estão corretas.
Pode um Profile
(ou Person
) jogar diferente Roles
dentro do mesmo Location
? ou seja, pode Person
ser, ao mesmo tempo, o Admin
e também um Member
do mesmo Location
? Quais são as regras nesse sentido?
Eu acho que o mesmo Profile
(ou Person
) pode jogar diferente Roles
em diferente Locations
. Por exemplo: Um específico Profile
(ou Person
) é o "Admin" em Location
"1" e o mesmo Profile
(ou Person
) é um " Member
" em Location
"2", ao mesmo tempo. Estou certo?
É possível que um particular Location
tenha diferentes LocationTypes
ao mesmo tempo, ou um indivíduo está Location
fixo para manter exatamente um LocationType
?
O atributo Organization.Website
representa o endereço do site de uma organização específica, como "dba.stackexchange.com"?
Se Profile
"1" (entendido como Person
) é um Member
(ou Friend
) de Profile
"2", é possível que Profile
"1" execute um Role
em uma Location
propriedade de Profile
"2"? Considero que esses cenários são válidos apenas para os relacionamentos entre um Organization
e um Member
Person
então, o que você acha?
De maneira semelhante, se Organization
"1" é um Member
(ou Friend
) de Organization
"2", é possível para Organization
"1" executar um Role
em uma Location
propriedade de Organization
"2"? Mais uma vez, acho que esse tipo de cenário é válido apenas para os relacionamentos entre an Organization
e a Member
Person
, isso está correto?
Nesse sentido, enquanto escrevo essas perguntas, acho que seria razoável dizer que existem apenas três tipos diferentes de relacionamentos envolvendo Organizations
e Persons
, e podemos definir:
- (a) A relação entre an
Organization
e a Person
como “ Membership
”.
- (b) A relação entre um
Person
e outro diferente Person
como “ Friendhip
”.
- (c) Ainda precisamos encontrar um nome significativo para descrever o relacionamento entre um indivíduo
Organization
e outro diferente Organization
.
- Então, deixe-me saber o que você pensa sobre (a), (b) e (c).
É possível para um Organization
ser um Friend
(ou uma Member
) de um-para-muitos diferentes Organizations
ao mesmo tempo? Ou só é possível para um Organization
ter apenas um relacionamento com exclusivamente um diferenteOrganization?
Modelo de dados sucessivo representando o primeiro avanço
Em atenção às suas respostas e resoluções aos aspectos pendentes listados acima, criei o seguinte…
Embora ainda não me sinta à vontade com ele, este novo modelo de dados expressa as seguintes regras de negócios:
- Um
Profile
é qualquer um Organization
ou uma Person
. [2]
- A
Profile
pode ser o amigo que oferece de um para muitos FriendProfiles
e a Profile
pode ser o amigo que aceita de um para muitos FriendProfiles
. [3]
- A
Location
pode consistir em um para muitos Locations
. [4]
Respostas aos seus comentários específicos subsequentes
É realmente interessante observar / agravar a separação de preocupações [por exemplo, LocationAddress e ProfileAddress] - porque eu obviamente queria me apressar e manter todas elas sem as relações corretas [engraçado, engraçado, não parecia certo com o meu ERD original].
Sim, essa é uma boa comparação, embora eu não a chamasse de separação de preocupações (que é, certamente, um princípio fundamental na programação e design de aplicativos), uma vez que esse termo geralmente pertence ao estágio de desenvolvimento de aplicativos e atualmente nos encontramos no estágio de compreensão dos dados e design de sua estrutura lógica.
Pela minha experiência pessoal, considero que esta fase tem a ver com colocar as coisas significativas em todo o seu contexto, tem a ver com as associações existentes entre as diferentes entidades que são relevantes no cenário de interesse específico e, em seguida, descrevendo essas coisas em um modelo de dados. No caso específico sobre o qual você está comentando, a Address
entidade pode ter diferentes tipos de conexões com outras entidades, uma com Profile
e outra com Location
.
E, sim, quando algo não parece certo ou natural , pode ser um sinal de que é preciso fazer mais esforço para entender os dados pertinentes. Dessa forma, a Address
entidade é uma das coisas que considero que precisam de mais atenção, pois acho que o relacionamento entre a Profile
e a Address
poderia ser tratado por meio da Location
entidade (devido ao fato de que todos Location
devem ter pelo menos um físico Address
), portanto, poderíamos descartar a ProfileAddress
entidade associativa descrita no modelo mais recente, mas você deve continuar analisando esses pontos e me informar suas idéias.
Além disso, é prática comum no IDEF1X alterar negações de PK / FK em entidades para melhor legibilidade [por exemplo, ProfileId - LocationOwnerProfileId]?
Sim, esse é um comentário muito inteligente, pois o IDEF1X recomenda o uso de nomes de funções para denominar ESTRANGEIRAS, a fim de capturar o significado de tais atributos de acordo com a entidade em que está sendo usado. Também é importante notar que isso também está fortemente relacionado ao conceito de migração de chaves primárias . De fato, o uso de nomes de funções precede o IDEF1X, pois foi originalmente apresentado pelo Dr. EF Codd em seu texto seminal de 1970. Dessa maneira, pode-se ver claramente a fidelidade que o padrão IDEF1X mantém em relação ao modelo relacional .
Eu ficaria intrigado em aprender o que você não gosta particularmente / sente que não modela, com / na solução?
Além dos detalhes já descritos acima sobre a Address
entidade, não tenho certeza se os Roles
realizados por um dado Profile
em particular Location
são equivalentes a um Organization
ou a um Person
. Na minha perspectiva, um Person
primeiro precisa estar associado a um Organization
e, em seguida, isso Organization
indicaria Person
executar um Role
em um particular Location
, mas você conhece melhor o cenário, portanto essas regras podem ser desnecessárias. A este respeito, vou insistir sobre o fato de que seria muito útil para mim saber a descrição contextual ou significado que os futuros utilizadores desta estrutura de dados dar a Organization
, Profile
e,Location
, mas entendo que isso pode ser considerado uma informação confidencial, portanto, isso seria uma limitação.
Com a estrutura atual, parece que todo mundo ( Organization
ou Person
) pode estar relacionado a qualquer pessoa (de novo Organization
ou Person
) e pode ser / fazer qualquer coisa ( Role
) em qualquer lugar ( Location
), mas, talvez, isso é exatamente o que você e os usuários estão esperando deste banco de dados , para o qual você fornecerá restrições bem definidas, é claro. Se for esse o caso, estamos quase fornecendo uma solução final. Como, naturalmente, sua opinião é decisiva nessa situação, você também deve analisar essas idéias e me informar suas conclusões para que possamos dar os passos finais.
Segundo avanço viável
Infelizmente, a comunicação parou há algumas semanas, acho que por causa dos compromissos de trabalho que você deve cumprir, o que é completamente razoável. Eu teria ficado muito mais satisfeito se tivéssemos desenvolvido um modelo mais estável e robusto, mas, devido às nossas interações anteriores, posso assumir que fui capaz de apontá-lo na direção certa.
Além do que já foi apresentado neste processo de perguntas e respostas, considero que fornecer uma nova progressão a partir dos modelos de dados anteriores pode ser útil para outros buscadores com um problema semelhante. Então, eu criei o…
Modelo Preliminar de Dados para Organizações e Perfis - Segundo Avanço
Como pode ser visto em tal modelo de dados, removi o relacionamento muitos-para-muitos que descrevi nos modelos anteriores entre Profile
e Address
, uma vez que um dado Profile
já está relacionado a um-para-muitos Addresses
por meio de sua propriedade Locations
.
Outra mudança ilustrada neste novo avanço é o fato de agora incluir a possibilidade de que um dado Location
possa pertencer a um para muitos Profiles
. Conseqüentemente, alterei a Location
PRIMARY KEY (descartando o LocationOwnerProfileId
atributo) e, em seguida, adicionei uma entidade associativa ( muitos para muitos ) relacionada Profile
a ele Location
.
Notas
1. IDEF1X é uma técnica de modelagem de dados altamente recomendável que foi definida como padrão em dezembro de 1993 pelo Instituto Nacional de Padrões e Tecnologia dos EUA ( NIST ).
2. Esta é uma ocorrência de um cluster de (super) subtipo de tipo . Caso você esteja interessado, aqui está uma resposta na qual trato de maneira mais detalhada com esse tipo de relacionamento.
3. Um exemplo de um relacionamento hierárquico muitos para muitos e é muito semelhante à estrutura que deu uma solução definitiva para o “Problema de Exploração de Peças” . É claro que essa solução foi introduzida pelo Dr. Edgar Frank Codd em seu artigo de 1970 extremamente influente "Um modelo relacional de dados para grandes bancos de dados compartilhados" .
4. Como tal, esta é uma instância de um relacionamento hierárquico um para muitos (ou muitos para um) .