Comment concevoir ce simple DB?
-
16-10-2019 - |
Question
Comment concevoir ce simple DB?
Je dois ajouter certaines choses à une utilisation DB I pour garder la trace des serveurs.
Le tableau ressemble à quelque chose comme ça.
Matrix
| Name | Description | Etc | Etc |
------------------------------------------------
| Server01 | First Server | Data | Data |
Je veux ajouter une table appelée mises à jour. Il devrait ressembler à ceci:
Updates
| Name | Q1 Updates | Q2 Updates | Q3 Updates |
------------------------------------------------------
| Server01 | Done | Incomplete | Incomplete |
Quelle est la meilleure façon de « lien » ces tableaux? Je dois tout dans le champ Nom de matrice à la table updates. Je suis un noob fondamental en matière de bases de données, donc j'ai besoin de 101 aider.
J'ai quelques déclencheurs mis en place pour une autre table qui conserve la trace d'autres informations et qui fonctionne très bien ... Je peux ajouter plus de déclencheurs pour la table, je suis désireux de créer ... mais je ne suis pas sûr c'est la meilleure méthode.
Que feriez-vous?
EDIT: Je veux le champ Nom de mises à jour pour toujours une réplique exacte de ce qui est dans Matrix
.La solution
Je probablement commencer par quelque chose comme ceci:
create table Matrix (
id integer primary key auto_increment,
Name varchar(30) not null,
Description varchar(30) not null
);
create table Updates ( -- Note, singular not possible, conflicts with keyword 'update'.
id integer primary key auto_increment,
Name varchar(20) not null
);
create table UpdateStatus (
id integer primary key auto_increment,
Name varchar(20)
);
create table Matrix_Update (
id_Matrix integer not null,
id_Updates integer not null,
id_UPdateStatus integer not null,
--
foreign key (id_Matrix ) references Matrix (id),
foreign key (id_Updates ) references Updates (id),
foreign key (id_UpdateStatus) references UpdateStatus(id)
);
Vous remplissez ensuite vos entrées Matrix
insert into Matrix (id, Name, Description) values ( 1, 'Server01', 'First Server');
insert into Matrix (id, Name, Description) values ( 2, 'Server02', 'Second Server');
De même, les mises à jour sont remplies comme si
insert into Updates (id, Name) values ( 1, 'Q1 Update');
insert into Updates (id, Name) values ( 2, 'Q2 Update');
insert into Updates (id, Name) values ( 3, 'Q3 Update');
Enfin, insérez la mise à jour possible Stati
insert into UpdateStatus (id, Name) values (1, 'Done');
insert into UpdateStatus (id, Name) values (2, 'Incomplete');
Maintenant, vous avez le cadre d'assembler votre "configuration":
insert into Matrix_Update (id_Matrix, id_Updates, id_UpdateStatus) values ( 1, 1, 1);
insert into Matrix_Update (id_Matrix, id_Updates, id_UpdateStatus) values ( 1, 2, 2);
insert into Matrix_Update (id_Matrix, id_Updates, id_UpdateStatus) values ( 1, 3, 2);
Cette "configuration" peut alors être interrogé avec pivot requête :
-- Pivot Query
select
Matrix.Name MatrixName,
Matrix.Description MatrixDescription,
group_concat(if(Updates.id = 1, UpdateStatus.Name, null )) Status1,
group_concat(if(Updates.id = 2, UpdateStatus.Name, null )) Status2,
group_concat(if(Updates.id = 3, UpdateStatus.Name, null )) Status3
from
Matrix_Update join
Matrix on Matrix_Update.id_Matrix= Matrix.id join
UpdateStatus on Matrix_Update.id_UpdateStatus = UpdateStatus.id join
Updates Updates on Matrix_Update.id_Updates = Updates.id
group by
Matrix.Name,
Matrix.Description;
Je veux que le champ Nom de mises à jour pour toujours une réplique exacte de ce qui est dans Matrix.
Avec cette conception, c'est pas un problème, puisque le nom ne sont pas stockées de manière redondante.
Autres conseils
D'après ce que vous avez ici, il semble que vous devriez être en mesure de rejoindre Matrix et mises à jour en même temps en fonction sur le champ « Nom ». Si vous voulez voir tous les serveurs de Matrix qui avaient des mises à jour, vous pourriez à quelque chose comme ceci:
SELECT m.Name, m.Description, u.*
FROM Matrix m
INNER JOIN Updates u ON u.Name = m.Name;
C'est basé sur quelques hypothèses:
- « Nom » est votre clé primaire dans les deux tableaux.
- « Nom » est unique dans le tableau des mises à jour (pas de serveur aurait plus d'une entrée).
"Que feriez-vous?"
Si c'était moi, je créerais une table mises à jour que quelque chose ressemblait à ceci:
table: Updates
Name varchar(16)
TimeFrame varchar(3)
Status varchar(10)
ligne de données ressemblerait à ceci:
name TimeFrame Status
Server01 Q1 Done
Server01 Q2 Incomplete
Server01 Q3 Incomplete
Il aurait un composite clé (primaire) du nom et TimeFrame pour garantir l'unicité (parce que dans ce scénario, sera répété « Nom »).
L'avantage ici est que si votre calendrier de mises à jour est modifiée / augmentée à tout moment (ex: si vous commencez à faire des mises à jour tous les 2 mois, au lieu de trois mois), vous avez la possibilité d'ajouter des mises à jour sans avoir à ajouter une colonne à la table des mises à jour. Bien sûr, je dis que, sans savoir ce que le reste des champs sur les mises à jour sont, peut-être que cela n'a pas de sens. Ou il pourrait y avoir d'autres possibilités de normalisation / optimisation ainsi.
Comment cela?
CREATE TABLE Matrix
(
Name NVARCHAR(256) NOT NULL,
Description NVARCHAR(1000) NULL,
Etc DATATYPE,
.
.
)
CREATE TABLE Updates
(
Name NVARCHAR(256) NOT NULL,
UpdateType VARCHAR(25) NOT NULL, -- Q1 updates, Q2 Updates ...
UpdateStatus VARCHAR(25) NOT NULL, -- Done, Imcomplete, InProgress...
)
ALTER TABLE Updates ADD CONSTRAINT FK_Updates_Matrix
FOREIGN KEY (Name) REFERENCES Matrix (Name);