Digamos que eu tenha uma tabela chamada User_FriendList
, que tenha as seguintes características:
CREATE TABLE User_FriendList (
ID ...,
User_ID...,
FriendList_IDs...,
CONSTRAINT User_Friendlist_PK PRIMARY KEY (ID)
);
E suponhamos que a referida tabela contenha os seguintes dados:
+ ---- + --------- + --------------------------- + | ID | ID do usuário | ID da lista de amigos | + ---- + --------- + --------------------------- + | 1 | 102 2: 15: 66: 35: 26: 17: | + ---- + --------- + --------------------------- + | 2 114 1: 12: 63: 33: 24: 16: 102 | + ---- + --------- + --------------------------- + | 3 117 6: 24: 52: 61: 23: 90: 97: 118 | + ---- + --------- + --------------------------- +
Nota: O ":" (dois pontos) é o delimitador ao explodir no PHP em um array
.
Questões
Assim:
Essa é uma maneira conveniente de "armazenar" o
IDs
de aFriendList
?Ou, em vez disso, devo ter linhas individuais com apenas um único
FriendId
valor em cada uma delas e, quando precisar recuperar todas as linhas de uma determinada lista , basta executar uma consulta comoSELECT * FROM UserFriendList WHERE UserId = 1
?
Respostas:
Gerenciando uma informação individual
Supondo que, no seu domínio comercial,
em seguida, cada um datum específico reunidos na
Friendlist_IDs
coluna de valor múltiplo representa um pedaço de informação que carrega um significado muito exata. Portanto, a referida colunaResposta curta
Conseqüentemente, você deve reter cada um dos
Friendlist_IDs
valores em (a) uma coluna que aceita exclusivamente um único valor por linha em (b) uma tabela que represente o tipo de associação em nível conceitual que pode ocorrer entre os Usuários , ou seja, uma Amizade - como Vou exemplificar nas seções a seguir.Dessa forma, você será capaz de lidar com (i) a referida tabela como uma relação matemática e (ii) a referida coluna como um atributo da relação matemática - tanto quanto o MySQL e seu dialeto SQL permitirem, é claro -.
Por quê?
Como o modelo relacional de dados , criado pelo Dr. E. F. Codd , exige ter tabelas compostas de colunas que contêm exatamente um valor do domínio ou tipo aplicável por linha; portanto, declarar uma tabela com uma coluna que pode conter mais de um valor do domínio ou tipo em questão (1) não representa uma relação matemática e (2) não permitiria obter as vantagens propostas no referencial teórico acima mencionado.
Modelando amizades entre usuários : definindo primeiro as regras do ambiente de negócios
Eu recomendo começar a modelar um banco de dados delimitando - antes de mais nada - o esquema conceitual correspondente em virtude da definição das regras de negócios relevantes que, entre outros fatores, devem descrever os tipos de inter-relações existentes entre os diferentes aspectos de interesse, ou seja, , os tipos de entidade aplicáveis e suas propriedades ; por exemplo:
Diagrama do IDEF1X expositivo
Dessa maneira, consegui derivar o diagrama IDEF1X 1 mostrado na Figura 1 , que integra a maioria das regras formuladas anteriormente:
Conforme representado, Solicitante e Destinatário são denotações que expressam as Funções desempenhadas pelos Usuários específicos que participam de uma determinada Amizade .
Sendo assim, o tipo de entidade Amizade retrata um tipo de associação da proporção de cardinalidade muitos para muitos (M: N) que pode envolver ocorrências diferentes do mesmo tipo de entidade, ou seja, Usuário . Como tal, é um exemplo do construto clássico conhecido como "Lista de materiais" ou "Explosão de peças".
1 Definição de Integração para Modelagem de Informações ( IDEF1X ) é uma técnica altamente recomendável que foi estabelecida como padrão em dezembro de 1993 pelo Instituto Nacional de Padrões e Tecnologia dos EUA (NIST). É solidamente baseado em (a) o material teórico inicial criado pelo único autordo modelo relacional, ou seja, Dr. EF Codd ; (b) avisão de dados entre entidades e relacionamentos , desenvolvida pelo Dr. PP Chen ; e também (c) a Logical Database Design Technique, criada por Robert G. Brown.
Projeto lógico SQL-DDL ilustrativo
Então, a partir do diagrama IDEF1X apresentado acima, declarar um arranjo DDL como o que se segue é muito mais "natural":
Desta forma:
Vantagens de uma coluna de valor único
Como demonstrado, você pode, por exemplo:
Aproveite a integridade referencial imposta pelo sistema de gerenciamento de banco de dados (DBMS por brevidade) para a
Friendship.AddresseeId
coluna, pois a restrição como uma FOREIGN KEY (FK por brevidade) que faz uma referência àUserProfile.UserId
coluna garante que todo valor aponte para uma linha existente .Criar um composto chave primária (PK) composta da combinação de colunas
(Friendship.RequesterId, Friendship.AddresseeId)
, ajudando a elegantemente distinguir todas as linhas inseridas e, naturalmente, proteger a sua singularidade .Obviamente, isso significa que o anexo de uma coluna extra para valores substitutos atribuídos pelo sistema (por exemplo, um configurado com a propriedade IDENTITY no Microsoft SQL Server ou com o atributo AUTO_INCREMENT no MySQL) e o INDEX auxiliar são totalmente supérfluos .
Restrinja os valores retidos
Friendship.AddresseeId
para um tipo de dados preciso c (que deve corresponder, por exemplo, ao estabelecido paraUserProfile.UserId
, neste caso, INT), permitindo que o DBMS cuide da validação automática pertinente .Esse fator também pode ajudar a (a) utilizar as funções do tipo interno correspondentes e (b) otimizar o uso do espaço em disco .
Otimize a recuperação de dados no nível físico, configurando INDEXes subordinados pequenos e rápidos para a
Friendship.AddresseeId
coluna, pois esses elementos físicos podem ajudar substancialmente a acelerar as consultas que envolvem a coluna.Certamente, você pode, por exemplo, colocar um INDEX de coluna única
Friendship.AddresseeId
apenas, um de coluna múltipla que incluaFriendship.RequesterId
eFriendship.AddresseeId
, ou ambos.Evite a complexidade desnecessária introduzida pela “pesquisa” de valores distintos que são coletados na mesma coluna (provavelmente duplicados, digitados incorretamente etc.), um curso de ação que acabaria por retardar o funcionamento do seu sistema, porque você precisa recorrer a métodos não relacionais que consomem recursos e tempo para realizar a tarefa.
Portanto, há vários motivos que exigem a análise cuidadosa do ambiente de negócios relevante para marcar com precisão o tipo d de cada coluna da tabela.
Conforme exposto, o papel desempenhado pelo criador do banco de dados é primordial para fazer o melhor uso (1) dos benefícios de nível lógico oferecidos pelo modelo relacional e (2) dos mecanismos físicos fornecidos pelo DBMS de sua escolha.
a , b , c , d Evidentemente, ao trabalhar com plataformas SQL (por exemplo, Firebird e PostgreSQL ) que suportam a criação de DOMAIN (umrecurso relacional distinto), você pode declarar colunas que aceitam apenas valores que pertencem a seus respectivos compartilhado) DOMAINs.
Um ou mais programas aplicativos que compartilham o banco de dados em consideração
Quando você precisar empregar
arrays
o código do (s) programa (s) aplicativo (s) acessando o banco de dados, basta recuperar o (s) conjunto (s) de dados relevante (s) na íntegra e, em seguida, "vinculá-lo (s) à estrutura de código relacionada ou executar o processo (s) de aplicativos associado (s) que devem ocorrer.Benefícios adicionais de colunas com valor único: as extensões da estrutura do banco de dados são muito mais fáceis
Outra vantagem de manter o
AddresseeId
ponto de dados em sua coluna reservada e com o tipo correto é que ele facilita consideravelmente a extensão da estrutura do banco de dados, como exemplificarei abaixo.Progressão do cenário: Incorporando o conceito Status da Amizade
Como as Amizades podem evoluir ao longo do tempo, talvez seja necessário acompanhar esse fenômeno; portanto, você deverá (i) expandir o esquema conceitual e (ii) declarar mais algumas tabelas no layout lógico. Portanto, vamos organizar as próximas regras de negócios para delinear as novas incorporações:
Diagrama IDEF1X estendido
Sucessivamente, o diagrama IDEF1X anterior pode ser estendido para incluir os novos tipos de entidade e tipos de inter-relacionamento descritos acima. Um diagrama representando os elementos anteriores associados aos novos é apresentado na Figura 2 :
Adições à estrutura lógica
Posteriormente, podemos prolongar o layout DDL com as seguintes declarações:
Consequentemente, toda vez que o status de uma determinada amizade precisar ser atualizado, os usuários precisarão apenas INSERIR uma nova
FriendshipStatus
linha, contendo:o adequado
RequesterId
e osAddresseeId
valores - retirados da linha em questão -Friendship
;o novo e significativo
StatusCode
valor - retirado deMyStatus.StatusCode
-;o instante exato da INSERÇÃO, ou seja, - de
SpecifiedDateTime
preferência , usando uma função de servidor para que você possa recuperá-la e retê-la de maneira confiável -; eo
SpecifierId
valor que indicaria o respectivoUserId
que inseriu o novoFriendshipStatus
no sistema - idealmente, com a ajuda dos recursos de seus aplicativos -.Nessa medida, suponhamos que a
MyStatus
tabela inclui os seguintes dados -com valores de PK que são (a) pelo usuário final, app programmer- e amigável-DBA e (b) pequena e rápida em termos de bytes no físico nível de implementação -:Portanto, a
FriendshipStatus
tabela pode conter dados como mostrado abaixo:Como você pode ver, pode-se dizer que a
FriendshipStatus
tabela serve para o propósito de compreender uma série temporal .Postagens relevantes
Você também pode estar interessado em:
fonte