Qual é a melhor maneira de utilizador modelo definido relacionamentos hierárquicos em um banco de dados?
-
05-09-2019 - |
Pergunta
Essencialmente, eu quero que o usuário seja capaz de definir um modelo hierárquico, mas então eu preciso para permitir ao usuário armazenar dados dentro de seu modelo definido. Isso faz sentido? Assim, os usuários serão capazes de criar novos "tipos de unidade" para ser organizada de forma hierárquica e decidir como unidades destes tipos podem ser organizados. Um exemplo simples: na minha interface hipotético um usuário cria três tipos de unidade, tronco, filial e da folha. O usuário, em seguida, define as relações entre eles. A folha pode existir em qualquer ponto na hierarquia, um ramo deve ter um tronco como um pai. O usuário pode, em seguida, cria instâncias desses tipos de unidade (como unidades) e pode organizá-los de acordo com as regras definidas no seu modelo ... há uma boa maneira de fazer isso no banco de dados?
Solução
Esta é uma questão extremamente amplo, mas isso pode apontar na direção certa. Note que você só vai ser capaz de armazenar as regras de relacionamento no banco de dados. Aplicá-las será até o seu código de cliente. Tente este sobre para o tamanho ..
unit:
unit id,
name,
unit relationship:
unit id,
foreign unit id
Você pode então usar sua mesa relação unidade da seguinte forma ..
unit id
relaciona-se com a unidade que está descrevendo.
foreign unit id
deve ser anulável.
A unit
sem registros de relacionamento só pode existir na raiz da hierarquia. A unit
com um null
foreign unit id
pode ter qualquer outra unit
como seu pai. Caso contrário, um unit
deve ter um outro unit
como seu pai, e do tipo deve ser um daqueles definidos em seus registros de relacionamento.
Como para armazenar-se as instâncias, que deve ser simples ..
instance:
instance id,
unit id,
parent instance_id
Eu tenho certeza que não haveria outros campos que você precisa (nome, por exemplo), mas eu suponho que você começa a deriva.
Outras dicas
Você precisa implementar três conceitos:
- os "tipos de unidade" e suas associações permitidos
- a hierarquia
- as unidades reais
Esses conceitos podem coexistir mais ou menos independente no modelo, mas o trabalho em conjunto.
create table unittype
(
id int;
name varchar(20);
)
create table unitrelationship
(
id int;
parent_id int;
)
Você pode modelar a hierarquia como a tabela de auto-referência:
create table hierarchy
(
id int;
parent_id int;
unit_type_id int;
unit_id int;
)
Você pode então ter suas instâncias de unidade em uma ou mais tabelas e fazer com eles o que você descreveu.
create table unit
{
id int;
....
}
A boa notícia é que você está restringindo apenas os tipos de pais permitidos, que podem ser facilmente aplicadas em uma interface de usuário, por exemplo, escolhendo o pai de uma lista de todas as unidades existentes do tipo permitido.
Eu estou trabalhando em um problema semelhante, embora eu preciso para suportar múltiplas hierarquias (um conjunto de crianças, múltiplas visões hierárquicas). Eu encontrei Joe Celko "Árvores e hierarquias em SQL para Smarties" (ISBN: 1558609202) útil. Eu ainda estou trabalhando no problema, mas se trata-se muitas vezes ao discutir este tema que lhe pareceu apropriado para mencionar.