Pouvez-vous passer en revue ma database SQL simple et peut-être fournir des commentaires sur des choses que j'ai peut-être oublié? (7 Tables)

Voici le script SQL:

create table Employee( Carnet nvarchar(15) primary key, Name nvarchar(500), LastName nvarchar(500) ) create table Document( ID nvarchar(20) primary key, Employee nvarchar(15) foreign key references Employee(Carnet), Project nvarchar(20) foreign key references Project(ID) ) create table DocumentsArea( DocumentID nvarchar(20) foreign key references Document(ID), AreaID nvarchar(20) foreign key references Area(ID) ) create table Area( ID nvarchar(20) primary key, Name nvarchar(200), ) create table Project( ID nvarchar(20) primary key, Company nvarchar(500) foreign key references Company(Name), Title nvarchar(500), ) create table Company( Name nvarchar(500) primary key, CEO nvarchar(15) foreign key references Person(Carnet), NIT nvarchar(40) ) create table Person( Carnet nvarchar(15) primary key, Name nvarchar(100), LastName nvarchar(100) ) 

La database est assez simple, sauf pour le ssortingct nécessaire car on me dira plus tard quelles informations save sur Documents, etc.

Je suis un peu inexpérimenté avec les designs de database alors peut-être que j'oublie quelques choses. Aucune suggestion?

Je recommand fortement de ne pas faire de NVARCHAR (500) votre key primaire!

 create table Company( Name nvarchar(500) primary key, 

Votre key primaire dans SQL Server sera automatiquement votre key de cluster, et cela ne devrait jamais être plus grand qu'un GUID (16 octets) – certainement pas quelque chose qui est de 1000 octets, et changera probablement assez fréquemment au fil du time.

Sauf si vous avez déjà une key valide et petite (comme une key de client ou autre), je suggère d'utiliser des identifiants de substitution à la place – vous vous éviterez beaucoup de problèmes!

 CREATE TABLE dbo.Company(CompanyID INT PRIMARY KEY, Name nvarchar(500)) 

Votre key primaire / key de clustering doit toujours être:

  • petit (16 octets maximum)
  • unique
  • stable (ne change jamais)

Le problème avec une énorme key primaire comme celle-ci est que toutes les foreign keys deviennent aussi énormes et lourdes:

 create table Project( ID nvarchar(20) primary key, Company nvarchar(500) foreign key references Company(Name), Title nvarchar(500), ) 

Ce sera beaucoup plus facile si vous utilisez des ID de substitution:

 CREATE TABLE dbo.Project(ProjectID INT PRIMARY KEY, CompanyID INT FOREIGN KEY REFERENCES dbo.Company(CompanyID), Title nvarchar(500), ) 

et tous vos index non clusterisés sur cette table seront massivement gonflés et ingérables (et pas très utiles), puisque l'input de la key de clustering (ici: le champ NVARCHAR (500) de votre société) sera ajoutée à chaque input de chaque table index non clusterisé. Vous gaspillerez des méga-giga-octets d'espace disque en un rien de time ….

Tout d'abord, je suggérerais que vous utilisiez des colonnes IDENTITY int / bigint comme ID PrimaryKey pour chaque table plutôt que des champs Name / nvarchar.

a) Vous avez un name et un lastname . Je voudrais faire ce firstname et lastname (sauf si c'est ainsi que vous referencez les noms dans vos parameters régionaux).

b) Vous avez une table appelée Personne et une autre appelée Employés. Si les employés sont aussi des personnes, je les regrouperais dans une même table et aurais une autre méthode pour gérer leurs différences. Mais bien sûr, cela dépend de la façon dont datatables seront utilisées.

c) Je ne sais pas ce que signifie CARNET , mais j'utiliserais quelque chose de plus standard, comme ID pour les colonnes ID.

d) Ce que tout le monde a dit à propos de l'utilisation des cols d'identité comme PK dans chaque table.

e) Je m'attendais à une certaine relation entre l'ENTREPRISE et le DOCUMENT, puisqu'ils sont dans la database, mais je n'en ai pas vu.

f) Beaucoup de colonnes que j'appendais, mais puisque vous avez dit que les infos viendront plus tard, je ne ferai pas de commentaire ici.