Sei que existem vários símbolos para expressar a cardinalidade entre as entidades.
Mas existe uma maneira pragmática comum de expressar cardinalidade em ascii?
Exemplo: Usuário -- Grupo. Um usuário pode ter vários grupos e um grupo pode ter vários usuários.
Eu olhei para esta página: https://en.wikipedia.org/wiki/Cardinality_(data_modeling)
Por exemplo: "pedido" de um para muitos ←→ "item de linha"
Aqui estão algumas maneiras gráficas de expressar a cardinalidade:
https://en.wikipedia.org/wiki/Entity%E2%80%93relationship_model#Cardinalities
Qual é a maneira mais comum de expressar cardeais?
Existe um padrão/rfc para isso?
A maneira UML (linguagem de modelagem unificada) é representar a cardinalidade com
<lower bound> .. <upper bound>
, sendo cada um vinculado a um inteiro não negativo e*
representar potencialmente infinito. Você pode encontrar isso no ponto 7.5.4 Notação dentro da documentação vinculada anteriormente.No entanto, isso se aplica geralmente a muitos diagramas de modelagem diferentes e não exclusivamente a ERDs. Ao escrever relacionamentos entre tabelas de maneira relacional , a notação mais usada que encontrei foi
N:M
(ouN to M
,N,M
). A maneira como você descreve os relacionamentos também é importante, pois na verdade existem 2 partes de cardinalidade/multiplicidade que você precisa especificar. Verifique os seguintes exemplos:Encomendar com itens de linha . Um pedido deve ter pelo menos 1 item de linha e pode ter infinitos. Um item de linha não pode existir sem um pedido e pertence apenas a um pedido. Isso seria implementado em bancos de dados relacionais com tabela Order e LineItem, com LineItem tendo uma chave estrangeira não nula em relação a Order.
Funcionário consigo mesmo (relação da cadeia de comando). Um determinado funcionário pode não ter chefe (o principal chefe) ou apenas 1. Um chefe pode não ter funcionários abaixo, ou uma quantidade infinita. Isso seria implementado em bancos de dados relacionais com uma tabela Employee, que possui uma chave estrangeira consigo mesma que pode ser nula.
Pessoa consigo mesma (relações pai e mãe). Cada pessoa tem um pai e uma mãe. Cada pai pode não ter filhos, ou ter muitos (digamos, por exemplo, os pais podem ter uma quantidade infinita enquanto as mães podem ter até 10). A maneira de implementar isso em bancos de dados relacionais é por meio de 2 campos na mesma tabela Person, que se vincula a si mesma por meio de chave estrangeira anulável (reforço parcial).
A maioria dessas relações geralmente é simplificada apenas mencionando o limite superior de cada lado. Então, para o
boss to employee
seria1 to N
e lê-se como "um chefe pode ter até N funcionários, um funcionário pode ter até 1 chefe".Existem algumas ressalvas com essas expressões na implementação, dependendo de cada banco de dados que você usa.
No exemplo de pedido, se um pedido deve ter um item de linha existente ao criar o registro e um item de linha deve ter um pedido existente, como você pode carregá-los sem falhar? Em bancos de dados relacionais, primeiro você carrega o Pedido e depois seus itens de linha, então em um ponto há um pedido que não possui um item de linha, mas essa notação expressa não como ele deve ser implementado, mas como essas entidades estão relacionadas em um nível de negócios.
No exemplo da paternidade, em algum momento não haverá informações sobre um pai, caso contrário você teria uma quantidade infinita de níveis de paternidade. Portanto, a implementação real do nível superior seria
Person to father: 0 to 1
.Quanto ao exemplo gráfico, acho a notação pé de galinha a mais simples de usar, mas não existe um padrão universal para isso.
Eu simplesmente digo:
Há também 1:1, mas geralmente é um design ruim ter duas tabelas em um relacionamento 1:1.
Pode haver variantes com "0", mas isso pode ser mais confuso do que benéfico.
Eu costumo trabalhar com a notação pé de galinha. Na arte ASCII eu usaria o hífen e maior que / menor que. Por exemplo
Um cliente faz muitos pedidos
Customer -< Order
Um usuário está em muitos grupos; um grupo contém muitos usuários
User >-< Group
Os nomes dos relacionamentos podem ser inseridos entre os hífens ou entre colchetes
Customer --[Places]--< Order
Se a cardinalidade precisa for importante, ela pode ser anexada às extremidades
Child (1) --[Loves]--<(3) Teddies
Caret (^), v minúsculo e pipe (|) podem girar os diagramas se isso servir