Une table de domaines auto-définie est-elle normalisée?


3

Je ne connais pas vraiment le nom officiel de ce que j'ai créé, mais il ne peut s'agir de la première fois, alors je vous présente mes excuses pour ne pas connaître chaque terme.

Ma question, un tableau tel que décrit ci-dessous est-il normalisé?

pk  fk  description
1   1   domains
2   1   people
3   1   cars
4   2   tom
5   2   smith
6   3   vmw
7   2   betty
8   3   ford

La «règle» principale à laquelle cette table me confond est A table should store only data for a single type of entity .Il stocke les informations de domaine, mais il stocke les informations de plusieurs domaines.

Exemple d'utilisation de cette table, récupérez le domaine des personnes.

select * from domains where fk = 2

qui retourne

pk  fk  description
4   2   tom
5   2   smith
7   2   betty

Le fk est le 'domaine' dans lequel se trouve l'élément, qui est le pk du domaine.C’est ce qui me définit tout seul, car ce tableau définit les domaines qu’il contient.

  0

Ressemble à une [représentation hiérarchique] typique (https://en.wikipedia.org/wiki/Hierarchical_database_model). 08 nov.. 172017-11-08 15:15:26

+1

@mustaccio Je suppose que c'est le problème avec seulement apprendre par la pratique;Je suis confus au sujet de choses que nous savons depuis les années 60. 08 nov.. 172017-11-08 15:28:15

+2

Cela ne ressemble pas à un duplicata pour moi.Cette question concerne la structure EAV.Celui-ci semble être une simple structure hiérarchique.Cela ne ressemble pas à EAV, sauf si vous avez des colonnes et des tableaux de type EAV supplémentaires. 08 nov.. 172017-11-08 15:56:01

  0

@ MaxVernon vous avez raison.Le fk correspond au pk du parent de l'objet dans la même table.Mon exemple et ma question portaient sur l’utilisation d’une table EAV (Entity-Attribute-Value) pour les domaines de données;Je ne savais tout simplement pas qu'il s'appelait une table EAV. 08 nov.. 172017-11-08 16:49:06

+1

@ UpTide - oooooh.Je vois.Je me trompe*.Ce n'est pas typique EAV.Cette * est * hiérarchie.Je vais annuler le marquage "dupliquer". 08 nov.. 172017-11-08 16:52:27

+1

Salut.Veuillez expliquer ce que vous entendez par «normalisation» et ce que vous essayez de faire car il n’est pas clair que vous sachiez ce que cela signifie.Expliquez également les termes vagues idéosyncratiques non définis tels que "auto-définissant" & "stocke les informations de plusieurs domaines" & "définit les domaines qu’il contient".Qui, deviner, proviennent d'idées fausses.En outre, une référence qui dit "Une table ne doit stocker que les données d'un seul type d'entité" dans le contexte de la normalisation n'est pas utile, lisez un manuel de modélisation d'informations et de conception de base de données. 13 nov.. 172017-11-13 23:23:11

  0

@philipxy Par "normalisation", j'entends par référence aux formes normales des bases de données relationnelles.Par "auto-définissant", je veux dire que ma table est de nature récursive, ses éléments de données sont directement liés à d'autres éléments de données de la même table."Stocke les informations de plusieurs domaines" et "définit les domaines qu'il contient". Ceci est un exemple de la récursion dans la table, comment les éléments de données se décrivent et sont liés les uns aux autres.Ma citation de Wikipédia décrivait la première forme normale, que je pensais être contredite par ma table à cause de la récursion.Ma question a été engendrée par les besoins des entreprises et la lecture de DB Design 16 nov.. 172017-11-16 21:54:53

  0

@philipxy J'aurais également dû préciser que, lorsque je parle de "domaine", je veux dire un domaine de données où la valeur qu'un élément de données peut contenir est restreinte aux seules valeurs répertoriées dans le domaine. 16 nov.. 172017-11-16 21:58:31

  0

Cette phrase en surbrillance est inutilement vague pour la compréhension.Wikipedia et [dba.se] sont assez pauvres en ce qui concerne le modèle relationnel.Premièrement: quelle * méthode de conception * suivez-vous?** Utilisez des manuels. ** Des dizaines sont gratuites en ligne.Alors: quelle * définition * signifie * la * méthode *?[Malheureusement, même la plupart des manuels scolaires sont confondus à propos de "1NF" et signifient simplement bien conçus à certains égards.] (Https://stackoverflow.com/a/40640962/3404097) Puis: appliquez-le.Un correct ne mentionnera rien sur certaines valeurs de colonne apparaissant dans d'autres colonnes.PS Ceci est * une table [EAV] (https://stackoverflow.com/a/23950836/3404097). 28 nov.. 172017-11-28 01:36:33

+1

Remplacer un nom ou une description vague par un autre n’explique pas ce que vous * voulez * dire.Par exemple, "normalisé" est utilisé pour beaucoup de choses - différentes notions de "1NF" et décomposé en NF plus élevés.De même, reformuler des phrases avec une terminologie vague et des mots non définis entre guillemets n’explique rien.Par exemple, "de nature récursive" n'est pas plus clair que "se définit".Mon idée était que vous utilisiez des termes et des phrases inutilement vagues et mal définis (essentiellement * tout ce que vous écrivez *), mais si vous faites l'effort de dire clairement ce que vous voulez dire, vous commencerez à comprendre et à être compris. 28 nov.. 172017-11-28 01:59:07

  0

Cette phrase en surbrillance est inutilement vague.Wikipedia, [dba.se] et le Web sont assez pauvres en ce qui concerne le modèle relationnel.Premièrement: quelle * méthode de conception * suivez-vous?** Utilisez un manuel. ** Des dizaines sont gratuites en ligne.Alors: * Quelle définition de "normalisation" la méthode signifie-t-elle *?[(Malheureusement, même la plupart des manuels scolaires sont confondus à propos de "1NF" et signifient simplement bien conçus à certains égards.)] (Https://stackoverflow.com/a/40640962/3404097) Puis: appliquez-le.Il ne mentionnera pas les colonnes partageant des valeurs.PS Ceci est une * table de métadonnées *.Cela fait donc probablement partie d'une conception basée sur [EAV] (https://stackoverflow.com/a/23950836/3404097). 28 nov.. 172017-11-28 03:54:12

  0

@philipxy Si le collectif Internet et la plupart des manuels ne peuvent pas le dire clairement, pourquoi avez-vous même l'espoir que je pourrai jamais rêver de le faire?J'utilise ce tableau comme domaine général pour les listes déroulantes, pour épeler les abréviations, pour limiter les options, etc. dans le cadre d'un effort d'élagage des dizaines de tableaux de 1 à 12 lignes dans la base de données. 29 nov.. 172017-11-29 05:28:27

4

C'est ce qu'on appelle une "table à référence automatique" ou "hiérarchie à une seule table".Vous les interrogez normalement avec un CTE récursif parce que vous voulez les enfants, pas seulement sur une seule condition.

Remarque, normalement, vous placez le fk de la racine commenull

CREATE TABLE foo(pk,fk,description)
AS VALUES
     ( 1 , null , 'domains' ),
     ( 2 , 1 , 'people' ),
     ( 3 , 1 , 'cars' ),
     ( 4 , 2 , 'tom' ),
     ( 5 , 2 , 'smith' ),
     ( 6 , 3 , 'vmw' ),
     ( 7 , 2 , 'betty' ),
     ( 8 , 3 , 'ford' );

WITH RECURSIVE t(pk, fk, description, level) AS (
     SELECT pk, fk, ARRAY[description], 0
     FROM foo
     WHERE fk IS NULL
     UNION ALL
       SELECT foo.pk, foo.fk, t.description || foo.description, t.level+1
       FROM t
       JOIN foo ON (foo.fk = t.pk)
)
SELECT *
FROM t;

    pk | fk |   description    | level 
----+----+------------------------+-------
    1 |  | {domains}       |   0
    2 | 1 | {domains,people}    |   1
    3 | 1 | {domains,cars}     |   1
    4 | 2 | {domains,people,tom}  |   2
    5 | 2 | {domains,people,smith} |   2
    6 | 3 | {domains,cars,vmw}   |   2
    7 | 2 | {domains,people,betty} |   2
    8 | 3 | {domains,cars,ford}  |   2
(8 rows)

Maintenant, vous pouvez trouver tous{domains,cars}comme ça.

WITH RECURSIVE t(pk, fk, description, level) AS (
      SELECT pk, fk, ARRAY[description], 0
      FROM foo
      WHERE fk IS NULL
      UNION ALL
      SELECT foo.pk, foo.fk, t.description || foo.description, t.level+1
      FROM t
      JOIN foo ON (foo.fk = t.pk)
     )
     SELECT *
     FROM t
     WHERE description @> ARRAY['domains','cars'];
    pk | fk |   description   | level 
----+----+---------------------+-------
    3 | 1 | {domains,cars}   |   1
    6 | 3 | {domains,cars,vmw} |   2
    8 | 3 | {domains,cars,ford} |   2
(3 rows)

Mais le véritable avantage vient avec un peu plus de complexité.

INSERT INTO foo(pk,fk,description) VALUES
    ( 9, 8, 'Mustang' );

Maintenant, relancez la même requête, vous savez

 pk | fk |     description     | level 
----+----+-----------------------------+-------
    3 | 1 | {domains,cars}       |   1
    6 | 3 | {domains,cars,vmw}     |   2
    8 | 3 | {domains,cars,ford}     |   2
    9 | 8 | {domains,cars,ford,Mustang} |   3
(4 rows)

Mustangest sousfordet tout est dans ladomaindecars.

Vous pouvez également vouloir simplement le dernier élément du tableau dans le jeu de résultats, ou une piste de pkids.Tous ceux qui sontmineurvariations de ce même modèle utilisant des CTE récursifs.

Tous les exemples testés avec PostgreSQL

  0

Est-ce un CTE récursif où l'instruction select fait référence à la même table deux fois en utilisant deux alias? 08 nov.. 172017-11-08 17:14:13

  0

@ UpTide voir ma mise à jour, désolé je l'écrivais. 08 nov.. 172017-11-08 17:14:52

  0

@UpTide mis à jour à nouveau 08 nov.. 172017-11-08 17:27:32

+1

@ EvanCarroll & @UpTide Cette réponse n'a rien à voir avec un quelconque sens de la normalisation.Cela ne répond pas à la question. 28 nov.. 172017-11-28 00:22:08

  0

@philipxy Je dois convenir avec vous que techniquement, cela ne dit rien sur la normalisation.Que recommandez-vous que nous fassions? 29 nov.. 172017-11-29 05:06:38

  0

@ UpTide Voir mon dernier commentaire sur la question.Encore une fois: vous n'expliquez pas pourquoi vous voulez normaliser, vous n'expliquez pas ce que vous entendez par «normaliser», vous ne donnez aucune information pertinente concernant les différentes choses désignant «normaliser» choses qui ne concernent pas la normalisation, vous n’êtes pas clairs et vous n’avez abordé aucune de ces questions dans votre question.Alors, quelle est votre question?Je suppose que c'est "n'est pas" normalisé "une sorte de gros mot pour" OK ", et est-ce que cette conception représentant une profondeur de profondeur arbitraire est OK, car je ne sais pas comment l'interroger, Et si non, quoi? " 29 nov.. 172017-11-29 05:27:08

+1

@UpTide "Normaliser" implique la suppression des données redondantes.On dit que les données qui existent dans un seul endroit sont sous une forme "normale".Il existe différents niveaux de normalisation, mais lorsque vous demandez un * schéma idéal *, il existe plusieurs méthodes permettant de dire que les données sont normalisées.C’est une forme qui présente l’avantage supplémentaire d’être véritablement hiérarchique et d’adresser la hiérarchie nD, mais elle n’est ni plus ni moins normalisée que les autres formes normalisées. 29 nov.. 172017-11-29 05:48:03

  0

@philipxy je suis désolé phil;Je ne voulais pas insulter ou rabaisser la normalisation de la base de données pour vous.La partie que j’ai interrogée à propos de cette disposition de table indique si elle est conforme à la seconde forme normale définie dans «Systèmes de base de données».Courant Computer Science Symposium 6 ' 29 nov.. 172017-11-29 05:50:55

  0

En regardant sa réponse, ce n’est pas le problème ici @ UpTide. 29 nov.. 172017-11-29 05:52:07

+1

@ Evan (cc @ UpTide) Il est clair que vous ne savez pas non plus quelles sont les différentes notions de "normaliser". 29 nov.. 172017-11-29 05:58:59