Eu tenho um banco de dados gráfico com vários tipos de borda. Por exemplo
create table Person(Name varchar(50)) as node;
create table Friend as edge;
create table Manager as edge;
insert Person(Name) values ('Alice'), ('Bob'), ('Chris');
insert Friend($from_id, $to_id)
select
(select $node_id from Person where Name = 'Alice'),
(select $node_id from Person where Name = 'Bob');
insert Manager($from_id, $to_id)
select
(select $node_id from Person where Name = 'Alice'),
(select $node_id from Person where Name = 'Chris');
Posso encontrar todos os nós conectados a um determinado nó (polimorfismo de grafo) por meio de consultas UNION:
select
b.Name
from Person a, Person b, Friend f
where a.Name = 'Alice'
and match(a-(f)->b)
union
select
b.Name
from Person a, Person b, Manager m
where a.Name = 'Alice'
and match(a-(m)->b);
No entanto, isso rapidamente se torna complicado. O SQL Server não possui uma solução mais elegante incorporada à sintaxe.
Existe um padrão de projeto que permite polimorfismo?
As diferentes tabelas de arestas podem ser combinadas em uma única tabela, mantendo todas as associações:
Esta tabela pode ser consultada para recuperar todas as associações
Dando
A coluna ConnectionType é opcional, mas permite o mesmo nível de especificidade que o esquema original.
Essa abordagem é análoga a um design EAV e provavelmente sofrerá os mesmos problemas de desempenho em escala. Índices filtrados ajudarão