web-dev-qa-db-fra.com

Conception d'une base de données sur les zoos

J'essaie de concevoir une base de données stockant des données sur plusieurs zoos. Je veux juste demander si ma conception est bonne. Je connais assez bien SQL et vos questions, mais je ne suis pas un expert au design. Exigence:

Vous allez gérer des zoos, des animaux, de la nourriture, des visiteurs et des visites. Chaque zoo a une pièce d'identité, un administrateur, un nom et plusieurs animaux. Un animal a une pièce d'identité, un nom et une date de naissance; Il peut manger divers aliments, ce dernier consistant d'un identifiant et d'un nom. Le système stocke le quota quotidien (numéro d'entier) pour chaque animal et nourriture, par exemple un animal A1 <aliment F1, 10; nourriture f2, 5>; animal A2 <nourriture F2, 1; Nourriture F5, 2>. Un visiteur est caractérisé par un numéro personnel (un identifiant), le nom et l'âge. Un visiteur peut visiter plusieurs zoos. Une telle visite est définie par un identifiant unique, une journée, le prix payé, le numéro personnel du visiteur et l'ID du zoo.

C'est comme ça que j'ai fait la conception:

CREATE TABLE Zoo(
    id INT PRIMARY KEY IDENTITY(1,1),
    administrator VARCHAR(30),
    name VARCHAR(40),
);

CREATE TABLE Animal(
    id INT PRIMARY KEY IDENTITY(1,1),
    name VARCHAR(30),
    dob DATE,
    Zoo_id INT REFERENCES Zoo(id)
);

CREATE TABLE Food(
    id INT PRIMARY KEY IDENTITY(1,1),
    name VARCHAR(25)
);

CREATE TABLE DailyQuota(
    id INT PRIMARY KEY IDENTITY(1,1),
    animal_id INT REFERENCES Animal(id),
    food_id INT REFERENCES Food(id),
    quantity INT
);

CREATE TABLE Visitor(
    id INT PRIMARY KEY IDENTITY(1,1),
    name VARCHAR(40),
    age TINYINT
);

CREATE TABLE Visit(
    id INT PRIMARY KEY IDENTITY(1,1),
    Zoo_id INT REFERENCES Zoo(id),
    visitor_id INT REFERENCES Visitor(id),
    day DATE,
    paid_price SMALLINT
);

Vouloir entendre des opinions


J'ai également dû créer une vue qui montre les identifiants des zoos que le plus petit nombre de visiteurs. Voici comment je l'ai fait:


GO
CREATE OR ALTER VIEW view_smallestCountVisitors
AS
    SELECT t1.Zoo_id
    FROM (SELECT v.Zoo_id, COUNT(v.Zoo_id) MYCOUNT
            FROM Visit v
            GROUP BY v.Zoo_id) t1
    WHERE t1.MYCOUNT IN (
        SELECT MIN(t2.MYCOUNT)
        FROM (SELECT v.Zoo_id, COUNT(v.Zoo_id) MYCOUNT
                FROM Visit v
                GROUP BY v.Zoo_id) t2
        );
GO

Cela fonctionne bien mais je me demande simplement si cela peut être fait de manière plus courte.

4
hackermanwow

Je vous recommande de scinder la partie animale et la partie des visiteurs en deux schémas différents. Ils sont conceptuellement deux domaines différents et vous pouvez avoir des horaires de développement et de maintenance différents. Je pense que la copie des deux ensemble augmente la complexité et la complexité est corrélée au coût et aux bugs.

La séparation peut également aider à la sécurité de l'information. Bien que la base de données des visiteurs puisse avoir besoin d'une présence sur Internet (par exemple, des comptes de titulaires de la saison/de la saisie annuelle), la partie animal n'a pas besoin d'être sur Internet et peut avoir une connectivité limitée (ou non) à Internet.

Je préconiserais un troisième schéma - Opérations commerciales (maintenance, inventaire, achat). Définissez une norme d'échange de données entre les différents schémas (par exemple, un message de consommation alimentaire au schéma d'entreprise ops).

Dans mon expérience, le "schéma de base de données à les gouverner tous" devient coûteux et difficile à maintenir.

2
Jim D