Qual é a melhor maneira de utilizador modelo definido relacionamentos hierárquicos em um banco de dados?

StackOverflow https://stackoverflow.com/questions/728137

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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top