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

.
Était-ce utile?

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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top