From e2ce435182801e17361d97ce5cf0c1e0b35bb3da Mon Sep 17 00:00:00 2001 From: laowantong Date: Sat, 10 Dec 2022 21:06:08 +0100 Subject: [PATCH] fix #66 --- doc/fr_refman.html | 3829 ++++++++-------- doc/fr_refman.ipynb | 4028 +++++++---------- mocodo/entity.py | 4 + mocodo/relations.py | 47 +- .../resources/relation_templates/diagram.json | 28 +- mocodo/resources/relation_templates/html.json | 6 - .../relation_templates/html_verbose.json | 36 +- mocodo/resources/relation_templates/json.json | 5 +- .../resources/relation_templates/latex.json | 6 - .../relation_templates/markdown.json | 6 - .../relation_templates/markdown_verbose.json | 117 +- .../resources/relation_templates/mysql.json | 6 - .../resources/relation_templates/oracle.json | 6 - .../relation_templates/postgresql.json | 6 - .../resources/relation_templates/sqlite.json | 6 - .../relation_templates/txt2tags.json | 6 - test/snapshots/snapshot.md | 297 +- test/snapshots/snapshot_static.svg | 2 +- test/test_relations.py | 91 +- 19 files changed, 3774 insertions(+), 4758 deletions(-) diff --git a/doc/fr_refman.html b/doc/fr_refman.html index 8d3ed20c..407715a7 100644 --- a/doc/fr_refman.html +++ b/doc/fr_refman.html @@ -13103,7 +13103,7 @@
-
In [3]:
+
In [1]:
%reload_ext mocodo
@@ -13113,10 +13113,28 @@
 
+
+
+ + +
+ +
+ + +
+
Mocodo 3.1.0 loaded.
+
+
+
+ +
+
+
-
In [4]:
+
In [2]:
from IPython import display
@@ -13158,7 +13176,7 @@ 

Introduction&#

-
In [5]:
+
In [3]:
-
In [6]:
+
In [4]:
display.Markdown("mocodo_notebook/sandbox_data_dict.md")
@@ -13472,7 +13476,7 @@ 

Introduction&#
-
In [7]:
+
In [5]:
%mocodo --input mocodo_notebook/sandbox.mld --colors desert
@@ -13535,7 +13540,7 @@ 

Introduction&# - + @@ -13549,7 +13554,7 @@

Introduction&# - + @@ -13565,7 +13570,7 @@

Introduction&# - + @@ -13579,7 +13584,7 @@

Introduction&# - + @@ -13594,7 +13599,7 @@

Introduction&# - + @@ -13614,7 +13619,7 @@

Introduction&# - + @@ -13732,7 +13737,7 @@

Vérification
-
In [8]:
+
In [6]:
-
In [9]:
+
In [7]:
%%mocodo
@@ -14286,10 +14291,10 @@ 

Modification in situ d'une
- + - + 1,N @@ -14305,7 +14310,7 @@

Modification in situ d'une - + 0,N @@ -14320,7 +14325,7 @@

Modification in situ d'une - + @@ -14335,7 +14340,7 @@

Modification in situ d'une - + @@ -14350,7 +14355,7 @@

Modification in situ d'une - + @@ -14383,7 +14388,7 @@

Modification in situ d'une

-
In [10]:
+
In [8]:
%%mocodo
@@ -14410,10 +14415,10 @@ 

Modification in situ d'une
- + - + 1,N @@ -14429,7 +14434,7 @@

Modification in situ d'une - + 0,N @@ -14444,7 +14449,7 @@

Modification in situ d'une - + @@ -14459,7 +14464,7 @@

Modification in situ d'une - + @@ -14474,7 +14479,7 @@

Modification in situ d'une - + @@ -14514,7 +14519,7 @@

Paramétrage à long terme
-
In [11]:
+
In [9]:
# You may edit and run the following lines
@@ -14588,7 +14593,7 @@ 

Paramétrage à long terme -
Out[11]:
+
Out[9]:
@@ -14613,7 +14618,7 @@

Paramétrage à long terme
-
In [12]:
+
In [10]:
-
In [13]:
+
In [11]:
%%mocodo
@@ -14768,10 +14773,10 @@ 

- + - + 0,N @@ -14786,7 +14791,7 @@

- + 1,N @@ -14802,7 +14807,7 @@

- + @@ -14818,7 +14823,7 @@

- + @@ -14833,7 +14838,7 @@

- + @@ -14907,7 +14912,7 @@

Dépendances fonctionnelles
-
In [14]:
+
In [12]:
%%mocodo
@@ -14934,10 +14939,10 @@ 

Dépendances fonctionnelles - + - + 0,N @@ -14949,7 +14954,7 @@

Dépendances fonctionnelles - + 1,N @@ -14965,7 +14970,7 @@

Dépendances fonctionnelles - + @@ -14981,7 +14986,7 @@

Dépendances fonctionnelles - + @@ -14996,7 +15001,7 @@

Dépendances fonctionnelles - + @@ -15035,7 +15040,7 @@

Associations réflexives
-
In [15]:
+
In [13]:
-
In [16]:
+
In [14]:
%%mocodo
@@ -15147,10 +15152,10 @@ 

Placement sur plusieurs rangé
- + - + 1,1 @@ -15167,7 +15172,7 @@

Placement sur plusieurs rangé - + 1,N @@ -15182,7 +15187,7 @@

Placement sur plusieurs rangé - + @@ -15197,7 +15202,7 @@

Placement sur plusieurs rangé - + @@ -15253,7 +15258,7 @@

Identifiants multiples
-
In [17]:
+
In [15]:
%%mocodo
@@ -15276,10 +15281,10 @@ 

Identifiants multiples - + - + @@ -15321,7 +15326,7 @@

Flèches sur les pattes
-
In [18]:
+
In [16]:
%%mocodo
@@ -15348,10 +15353,10 @@ 

Flèches sur les pattes - + - + 1,N @@ -15368,7 +15373,7 @@

Flèches sur les pattes + 1,1 @@ -15384,7 +15389,7 @@

Flèches sur les pattes + 0,N @@ -15401,7 +15406,7 @@

Flèches sur les pattes + @@ -15414,7 +15419,7 @@

Flèches sur les pattes + @@ -15502,7 +15507,7 @@

Format des cardinalités
-
In [19]:
+
In [17]:
-
In [20]:
+
In [18]:
%%mocodo
@@ -15690,10 +15695,10 @@ 

Rectif
- + - + 0,N @@ -15708,7 +15713,7 @@

Rectif - + l,N @@ -15724,7 +15729,7 @@

Rectif - + @@ -15740,7 +15745,7 @@

Rectif - + @@ -15755,7 +15760,7 @@

Rectif - + @@ -15794,7 +15799,7 @@

Symbole de dépendance fon

-
In [21]:
+
In [19]:
%%mocodo --df=CIF
@@ -15821,10 +15826,10 @@ 

Symbole de dépendance fon
- + - + 0,N @@ -15836,7 +15841,7 @@

Symbole de dépendance fon - + 1,N @@ -15852,7 +15857,7 @@

Symbole de dépendance fon - + @@ -15868,7 +15873,7 @@

Symbole de dépendance fon - + @@ -15883,7 +15888,7 @@

Symbole de dépendance fon - + @@ -15934,7 +15939,7 @@

-
In [144]:
+
In [20]:
%%mocodo
@@ -15959,10 +15964,10 @@ 

- + - + 1,1 @@ -15977,7 +15982,7 @@

+ @@ -15990,7 +15995,7 @@

+ @@ -16021,7 +16026,7 @@

-
In [22]:
+
In [21]:
%%mocodo
@@ -16066,10 +16071,10 @@ 

- + - + 1,N @@ -16084,7 +16089,7 @@

+ 1,1 @@ -16099,7 +16104,7 @@

+ 0,N @@ -16116,7 +16121,7 @@

+ 0,N @@ -16131,7 +16136,7 @@

+ 0,N @@ -16149,7 +16154,7 @@

+ 0,N @@ -16166,7 +16171,7 @@

+ @@ -16183,7 +16188,7 @@

+ @@ -16197,7 +16202,7 @@

+ @@ -16212,7 +16217,7 @@

+ @@ -16226,7 +16231,7 @@

+ @@ -16256,7 +16261,7 @@

-
In [23]:
+
In [22]:
%%mocodo
@@ -16292,10 +16297,10 @@ 

- + - + 0,N @@ -16313,7 +16318,7 @@

+ 1,1 @@ -16328,7 +16333,7 @@

+ 0,N @@ -16345,7 +16350,7 @@

+ 0,N @@ -16362,7 +16367,7 @@

+ 1,N @@ -16377,7 +16382,7 @@

+ 0,N @@ -16392,7 +16397,7 @@

+ @@ -16407,7 +16412,7 @@

+ @@ -16420,7 +16425,7 @@

+ @@ -16434,7 +16439,7 @@

+ @@ -16448,7 +16453,7 @@

+ @@ -16465,7 +16470,7 @@

+ @@ -16509,7 +16514,7 @@

Entités faibles (id

-
In [24]:
+
In [23]:
%%mocodo
@@ -16534,10 +16539,10 @@ 

Entités faibles (id
- + - + 1,N @@ -16550,7 +16555,7 @@

Entités faibles (id - + @@ -16565,7 +16570,7 @@

Entités faibles (id - + @@ -16597,7 +16602,7 @@

Entités faibles (id

-
In [25]:
+
In [24]:
%%mocodo --strengthen_card (1,1)
@@ -16622,10 +16627,10 @@ 

Entités faibles (id
- + - + 1,N @@ -16637,7 +16642,7 @@

Entités faibles (id - + @@ -16652,7 +16657,7 @@

Entités faibles (id - + @@ -16684,7 +16689,7 @@

Entités faibles (id

-
In [26]:
+
In [25]:
%%mocodo
@@ -16733,7 +16738,7 @@ 

Conversion forc

-
In [27]:
+
In [26]:
%%mocodo
@@ -16758,10 +16763,10 @@ 

Conversion forc
- + - + 0,1 @@ -16778,7 +16783,7 @@

Conversion forc - + @@ -16792,7 +16797,7 @@

Conversion forc - + @@ -16839,7 +16844,7 @@

Agrégation (ou pseudo-enti

-
In [28]:
+
In [27]:
%%mocodo
@@ -16866,10 +16871,10 @@ 

Agrégation (ou pseudo-enti
- + - + 1,N @@ -16887,7 +16892,7 @@

Agrégation (ou pseudo-enti - + @@ -16900,7 +16905,7 @@

Agrégation (ou pseudo-enti - + @@ -16914,7 +16919,7 @@

Agrégation (ou pseudo-enti - + @@ -16946,7 +16951,7 @@

Agrégation (ou pseudo-enti

-
In [29]:
+
In [28]:
%%mocodo
@@ -16973,10 +16978,10 @@ 

Agrégation (ou pseudo-enti
- + - + 1,N @@ -16996,7 +17001,7 @@

Agrégation (ou pseudo-enti - + @@ -17009,7 +17014,7 @@

Agrégation (ou pseudo-enti - + @@ -17023,7 +17028,7 @@

Agrégation (ou pseudo-enti - + @@ -17053,7 +17058,7 @@

Agrégation (ou pseudo-enti

-
In [30]:
+
In [29]:
display.SVG("traditional_cluster.svg")
@@ -17069,7 +17074,7 @@ 

Agrégation (ou pseudo-enti
-
Out[30]:
+
Out[29]:
@@ -17173,7 +17178,7 @@

Agrégation (ou pseudo-enti

-
In [31]:
+
In [30]:
%%mocodo
@@ -17204,10 +17209,10 @@ 

Agrégation (ou pseudo-enti
- + - + 0,N @@ -17220,7 +17225,7 @@

Agrégation (ou pseudo-enti - + 0,N @@ -17233,7 +17238,7 @@

Agrégation (ou pseudo-enti - + 1,1 @@ -17245,7 +17250,7 @@

Agrégation (ou pseudo-enti - + @@ -17258,7 +17263,7 @@

Agrégation (ou pseudo-enti - + @@ -17270,7 +17275,7 @@

Agrégation (ou pseudo-enti - + @@ -17284,7 +17289,7 @@

Agrégation (ou pseudo-enti - + @@ -17315,7 +17320,7 @@

Agrégation (ou pseudo-enti

-
In [32]:
+
In [31]:
%%mocodo
@@ -17340,10 +17345,10 @@ 

Agrégation (ou pseudo-enti
- + - + 0,N @@ -17361,7 +17366,7 @@

Agrégation (ou pseudo-enti - + @@ -17375,7 +17380,7 @@

Agrégation (ou pseudo-enti - + @@ -17415,7 +17420,7 @@

Agrégation (ou pseudo-enti

-
In [33]:
+
In [32]:
%%mocodo
@@ -17442,10 +17447,10 @@ 

Agrégation (ou pseudo-enti
- + - + 0,N @@ -17465,7 +17470,7 @@

Agrégation (ou pseudo-enti - + @@ -17480,7 +17485,7 @@

Agrégation (ou pseudo-enti - + @@ -17494,7 +17499,7 @@

Agrégation (ou pseudo-enti - + @@ -17525,7 +17530,7 @@

Agrégation (ou pseudo-enti

-
In [34]:
+
In [33]:
%%mocodo
@@ -17554,10 +17559,10 @@ 

Agrégation (ou pseudo-enti
- + - + 0,N @@ -17577,7 +17582,7 @@

Agrégation (ou pseudo-enti - + @@ -17591,7 +17596,7 @@

Agrégation (ou pseudo-enti - + @@ -17605,7 +17610,7 @@

Agrégation (ou pseudo-enti - + @@ -17619,7 +17624,7 @@

Agrégation (ou pseudo-enti - + @@ -17684,7 +17689,7 @@

Introduction&#

-
In [35]:
+
In [34]:
%%mocodo
@@ -17713,10 +17718,10 @@ 

Introduction&#
- + - + @@ -17731,7 +17736,7 @@

Introduction&# - + @@ -17746,7 +17751,7 @@

Introduction&# - + @@ -17757,7 +17762,7 @@

Introduction&# - + @@ -17863,7 +17868,7 @@

Représentation graphique
-
In [36]:
+
In [35]:
%%mocodo --mld
@@ -17892,10 +17897,10 @@ 

Représentation graphique - + - + @@ -17912,7 +17917,7 @@

Représentation graphique + @@ -17927,7 +17932,7 @@

Représentation graphique + @@ -17938,7 +17943,7 @@

Représentation graphique + @@ -18008,7 +18013,7 @@

Représentation graphique
-
In [37]:
+
In [36]:
-
In [38]:
+
In [37]:
%%mocodo
@@ -18201,10 +18206,10 @@ 

Afficher l'explication des
- + - + 0,N @@ -18219,7 +18224,7 @@

Afficher l'explication des - + 1,N @@ -18235,7 +18240,7 @@

Afficher l'explication des - + @@ -18251,7 +18256,7 @@

Afficher l'explication des - + @@ -18266,7 +18271,7 @@

Afficher l'explication des - + @@ -18285,23 +18290,23 @@

Afficher l'explication des - - - - + + + +

@@ -18363,7 +18368,7 @@

Dévoiler un MCD par étap

-
In [39]:
+
In [38]:
%%mocodo  --colors ocean --shapes copperplate
@@ -18401,7 +18406,7 @@ 

Dévoiler un MCD par étap - + 1,1 @@ -18413,7 +18418,7 @@

Dévoiler un MCD par étap - + 1,N @@ -18429,7 +18434,7 @@

Dévoiler un MCD par étap - + 1,N @@ -18449,7 +18454,7 @@

Dévoiler un MCD par étap - + 0,N @@ -18464,7 +18469,7 @@

Dévoiler un MCD par étap - + 1,1 @@ -18479,7 +18484,7 @@

Dévoiler un MCD par étap - + @@ -18493,7 +18498,7 @@

Dévoiler un MCD par étap - + @@ -18507,7 +18512,7 @@

Dévoiler un MCD par étap - + @@ -18521,7 +18526,7 @@

Dévoiler un MCD par étap - + @@ -18535,7 +18540,7 @@

Dévoiler un MCD par étap - + @@ -18548,7 +18553,7 @@

Dévoiler un MCD par étap - + @@ -18561,21 +18566,21 @@

Dévoiler un MCD par étap - - - - - - + + + + + + - - - - + + + +

@@ -26452,7 +26417,7 @@

Conversion forc

-
In [86]:
+
In [85]:
%%mocodo --relations html_verbose
@@ -26477,10 +26442,10 @@ 

Conversion forc
- + - + 0,1 @@ -26497,7 +26462,7 @@

Conversion forc - + @@ -26511,7 +26476,7 @@

Conversion forc - + @@ -26535,7 +26500,7 @@

Conversion forc

-
In [87]:
+
In [86]:
display.HTML("mocodo_notebook/sandbox_verbose.html")
@@ -26551,7 +26516,7 @@ 

Conversion forc
-
Out[87]:
+
Out[86]:
@@ -26629,7 +26594,7 @@

Conversion forc

-
In [88]:
+
In [87]:
%%mocodo --relations html_verbose
@@ -26654,10 +26619,10 @@ 

Conversion forc
- + - + 1,1 @@ -26674,7 +26639,7 @@

Conversion forc - + @@ -26688,7 +26653,7 @@

Conversion forc - + @@ -26712,7 +26677,7 @@

Conversion forc

-
In [89]:
+
In [88]:
display.HTML("mocodo_notebook/sandbox_verbose.html")
@@ -26728,7 +26693,7 @@ 

Conversion forc
-
Out[89]:
+
Out[88]:
@@ -26806,7 +26771,7 @@

Conversion forc

-
In [90]:
+
In [89]:
%%mocodo --relations html_verbose
@@ -26831,10 +26796,10 @@ 

Conversion forc
- + - + 1,N @@ -26851,7 +26816,7 @@

Conversion forc - + @@ -26865,7 +26830,7 @@

Conversion forc - + @@ -26889,7 +26854,7 @@

Conversion forc

-
In [91]:
+
In [90]:
display.HTML("mocodo_notebook/sandbox_verbose.html")
@@ -26905,7 +26870,7 @@ 

Conversion forc
-
Out[91]:
+
Out[90]:
@@ -26997,7 +26962,7 @@

-
In [92]:
+
In [91]:
%%mocodo --mld
@@ -27024,10 +26989,10 @@ 

- + - + 1,N @@ -27047,7 +27012,7 @@

+ @@ -27060,7 +27025,7 @@

+ @@ -27074,7 +27039,7 @@

+ @@ -27115,25 +27080,11 @@

-
In [93]:
+
In [92]:
%%mocodo --mld
@@ -27183,10 +27134,10 @@ 

- + - + 0,N @@ -27204,7 +27155,7 @@

+ @@ -27218,7 +27169,7 @@

+ @@ -27313,7 +27264,7 @@

Sémantique de la flèche
-
In [94]:
+
In [93]:
%%mocodo --mld
@@ -27342,10 +27293,10 @@ 

Sémantique de la flèche - + - + @@ -27360,7 +27311,7 @@

Sémantique de la flèche - + @@ -27375,7 +27326,7 @@

Sémantique de la flèche - + @@ -27386,7 +27337,7 @@

Sémantique de la flèche - + @@ -27456,7 +27407,7 @@

Sémantique de la flèche
-
In [95]:
+
In [94]:
%%mocodo --mld
@@ -27485,10 +27436,10 @@ 

Sémantique de la flèche - + - + @@ -27505,7 +27456,7 @@

Sémantique de la flèche - + @@ -27520,7 +27471,7 @@

Sémantique de la flèche - + @@ -27531,7 +27482,7 @@

Sémantique de la flèche - + @@ -27597,7 +27548,7 @@

Sémantique de la flèche
-
In [96]:
+
In [95]:
-
Personne ( num SS, @@ -27752,7 +27701,7 @@

Sémantique de la flèche
-
In [97]:
+
In [96]:
%%mocodo --mld
@@ -27781,10 +27730,10 @@ 

Sémantique de la flèche - + - + @@ -27801,7 +27750,7 @@

Sémantique de la flèche - + @@ -27816,7 +27765,7 @@

Sémantique de la flèche - + @@ -27827,7 +27776,7 @@

Sémantique de la flèche - + @@ -27898,7 +27847,7 @@

Sémantique de la flèche
-
In [98]:
+
In [97]:
%%mocodo --mld
@@ -27960,7 +27909,7 @@ 

Héritage et associations ex

-
In [99]:
+
In [98]:
%%mocodo --relations diagram html_verbose
@@ -28005,10 +27954,10 @@ 

Héritage et associations ex
- + - + 1,N @@ -28023,7 +27972,7 @@

Héritage et associations ex - + 1,1 @@ -28038,7 +27987,7 @@

Héritage et associations ex - + 1,1 @@ -28053,7 +28002,7 @@

Héritage et associations ex - + @@ -28070,7 +28019,7 @@

Héritage et associations ex - + 1,N @@ -28085,7 +28034,7 @@

Héritage et associations ex - + 1,N @@ -28100,7 +28049,7 @@

Héritage et associations ex - + 1,N @@ -28115,7 +28064,7 @@

Héritage et associations ex - + @@ -28129,7 +28078,7 @@

Héritage et associations ex - + @@ -28142,7 +28091,7 @@

Héritage et associations ex - + @@ -28156,7 +28105,7 @@

Héritage et associations ex - + @@ -28170,7 +28119,7 @@

Héritage et associations ex - + @@ -28184,7 +28133,7 @@

Héritage et associations ex - + @@ -28197,7 +28146,7 @@

Héritage et associations ex - + @@ -28211,7 +28160,7 @@

Héritage et associations ex - + @@ -28225,7 +28174,7 @@

Héritage et associations ex - + @@ -28238,7 +28187,7 @@

Héritage et associations ex - + @@ -28261,7 +28210,7 @@

Héritage et associations ex

-
In [100]:
+
In [99]:
display.HTML("mocodo_notebook/sandbox_verbose.html")
@@ -28277,7 +28226,7 @@ 

Héritage et associations ex
-
Out[100]:
+
Out[99]:
@@ -28372,55 +28321,19 @@

Héritage et associations ex #magna )
    -
  • Le champ orci constitue la clé primaire de la table. C'était déjà un identifiant de l'entité SUSCIPIT.
  • -
  • Le champ lorem était déjà un simple attribut de l'entité SUSCIPIT.
  • -
  • Le champ magna est une clé étrangère. Il a migré par l'association de dépendance fonctionnelle RHONCUS à partir de l'entité TRISTIS en perdant son caractère identifiant.
  • -
+
  • Le champ orci constitue la
  • -
    -
    TRISTIS ( - magna, - vestibulum, - #fermentum, - type, - convallis, - ipsum, - pulvinar, - audis, - #gravida, - tempor, - fugit - ) -
      -
    • Le champ magna constitue la clé primaire de la table. C'était déjà un identifiant de l'entité TRISTIS.
    • -
    • Le champ vestibulum était déjà un simple attribut de l'entité TRISTIS.
    • -
    • Le champ fermentum est une clé étrangère. Il a migré par l'association de dépendance fonctionnelle ELIT à partir de l'entité CONSEQUAT en perdant son caractère identifiant.
    • -
    • Un champ entier type est ajouté pour indiquer la nature de la spécialisation : 1 pour la première entité-fille, 2 pour la deuxième, etc. Jamais vide, du fait de la contrainte de totalité.
    • -
    • Le champ convallis a migré à partir de l'entité-fille SODALES (supprimée).
    • -
    • Le champ ipsum a migré à partir de l'entité-fille SODALES (supprimée).
    • -
    • Le champ pulvinar a migré à partir de l'entité-fille NEC (supprimée).
    • -
    • Le champ audis a migré à partir de l'entité-fille NEC (supprimée).
    • -
    • Le champ gravida est une clé étrangère. Il a migré à partir de l'entité-fille NEC (supprimée) dans laquelle il avait déjà migré à partir de l'entité CURABITUR.
    • -
    • Le champ tempor a migré à partir de l'entité-fille LACUS (supprimée).
    • -
    • Le champ fugit a migré à partir de l'entité-fille LACUS (supprimée).
    • -
    -
    -
    ULTRICES ( - #posuere, - #magna - ) -
      -
    • Le champ posuere fait partie de la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité LIBERO.
    • -
    • Le champ magna fait partie de la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité TRISTIS.
    • -
    -
    +
    -
    - - +
    + + + +
    +limit_output extension: Maximum message size of 4000 exceeded with 7452 characters

    @@ -28431,7 +28344,7 @@

    Héritage et associations ex

    -
    In [101]:
    +
    In [100]:
    %mocodo --input mocodo_notebook/sandbox.mld
    @@ -28453,10 +28366,10 @@ 

    Héritage et associations ex
    - + - + @@ -28471,7 +28384,7 @@

    Héritage et associations ex - + @@ -28486,7 +28399,7 @@

    Héritage et associations ex - + @@ -28500,7 +28413,7 @@

    Héritage et associations ex - + @@ -28523,7 +28436,7 @@

    Héritage et associations ex - + @@ -28537,7 +28450,7 @@

    Héritage et associations ex - + @@ -28551,7 +28464,7 @@

    Héritage et associations ex - + @@ -28566,7 +28479,7 @@

    Héritage et associations ex - + @@ -28581,7 +28494,7 @@

    Héritage et associations ex - + @@ -28660,7 +28573,7 @@

    Héritage et associations ex

    -
    In [102]:
    +
    In [101]:
    %%mocodo --relations diagram html_verbose
    @@ -28705,10 +28618,10 @@ 

    Héritage et associations ex
    - + - + 1,N @@ -28723,7 +28636,7 @@

    Héritage et associations ex - + 1,1 @@ -28738,7 +28651,7 @@

    Héritage et associations ex - + 1,1 @@ -28753,7 +28666,7 @@

    Héritage et associations ex - + @@ -28772,7 +28685,7 @@

    Héritage et associations ex - + 1,N @@ -28787,7 +28700,7 @@

    Héritage et associations ex - + 1,N @@ -28802,7 +28715,7 @@

    Héritage et associations ex - + 1,N @@ -28817,7 +28730,7 @@

    Héritage et associations ex - + @@ -28831,7 +28744,7 @@

    Héritage et associations ex - + @@ -28844,7 +28757,7 @@

    Héritage et associations ex - + @@ -28858,7 +28771,7 @@

    Héritage et associations ex - + @@ -28872,7 +28785,7 @@

    Héritage et associations ex - + @@ -28886,7 +28799,7 @@

    Héritage et associations ex - + @@ -28899,7 +28812,7 @@

    Héritage et associations ex - + @@ -28913,7 +28826,7 @@

    Héritage et associations ex - + @@ -28927,7 +28840,7 @@

    Héritage et associations ex - + @@ -28940,7 +28853,7 @@

    Héritage et associations ex - + @@ -28963,7 +28876,7 @@

    Héritage et associations ex

    -
    In [103]:
    +
    In [102]:
    display.HTML("mocodo_notebook/sandbox_verbose.html")
    @@ -28979,7 +28892,7 @@ 

    Héritage et associations ex
    -
    Out[103]:
    +
    Out[102]:
    @@ -29074,79 +28987,19 @@

    Héritage et associations ex #gravida )
      -
    • Le champ magna constitue la clé primaire de la table. C'est une clé étrangère qui a migré à partir de l'entité-mère TRISTIS.
    • -
    • Les champs pulvinar et audis étaient déjà de simples attributs de l'entité NEC.
    • -
    • Le champ gravida est une clé étrangère. Il a migré par l'association de dépendance fonctionnelle MOLLIS à partir de l'entité CURABITUR en perdant son caractère identifiant.
    • -
    +
  • Le champ magna constitue la clé primaire de la table. C'est
  • -
    -
    QUAM ( - cras, - sed, - #magna - ) -
      -
    • Le champ cras constitue la clé primaire de la table. C'était déjà un identifiant de l'entité QUAM.
    • -
    • Le champ sed était déjà un simple attribut de l'entité QUAM.
    • -
    • Le champ magna est une clé étrangère. Il a migré par l'association de dépendance fonctionnelle VITAE à partir de l'entité SODALES en perdant son caractère identifiant.
    • -
    -
    -
    SODALES ( - #magna, - convallis, - ipsum - ) -
      -
    • Le champ magna constitue la clé primaire de la table. C'est une clé étrangère qui a migré à partir de l'entité-mère TRISTIS.
    • -
    • Les champs convallis et ipsum étaient déjà de simples attributs de l'entité SODALES.
    • -
    -
    +
    -
    -
    SUSCIPIT ( - orci, - lorem, - #magna - ) -
      -
    • Le champ orci constitue la clé primaire de la table. C'était déjà un identifiant de l'entité SUSCIPIT.
    • -
    • Le champ lorem était déjà un simple attribut de l'entité SUSCIPIT.
    • -
    • Le champ magna est une clé étrangère. Il a migré par l'association de dépendance fonctionnelle RHONCUS à partir de l'entité TRISTIS en perdant son caractère identifiant.
    • -
    -
    +
    -
    -
    TRISTIS ( - magna, - vestibulum, - #fermentum, - type - ) -
      -
    • Le champ magna constitue la clé primaire de la table. C'était déjà un identifiant de l'entité TRISTIS.
    • -
    • Le champ vestibulum était déjà un simple attribut de l'entité TRISTIS.
    • -
    • Le champ fermentum est une clé étrangère. Il a migré par l'association de dépendance fonctionnelle ELIT à partir de l'entité CONSEQUAT en perdant son caractère identifiant.
    • -
    • Un champ entier type est ajouté pour indiquer la nature de la spécialisation : 1 pour la première entité-fille, 2 pour la deuxième, etc. Jamais vide, du fait de la contrainte de totalité.
    • -
    -
    -
    -
    ULTRICES ( - #posuere, - #magna - ) -
      -
    • Le champ posuere fait partie de la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité LIBERO.
    • -
    • Le champ magna fait partie de la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité LACUS.
    • -
    -
    -
    - - +
    +limit_output extension: Maximum message size of 4000 exceeded with 8212 characters

    @@ -29157,7 +29010,7 @@

    Héritage et associations ex

    -
    In [104]:
    +
    In [103]:
    %mocodo --input mocodo_notebook/sandbox.mld
    @@ -29179,10 +29032,10 @@ 

    Héritage et associations ex
    - + - + @@ -29197,7 +29050,7 @@

    Héritage et associations ex - + @@ -29212,7 +29065,7 @@

    Héritage et associations ex - + @@ -29227,7 +29080,7 @@

    Héritage et associations ex - + @@ -29241,7 +29094,7 @@

    Héritage et associations ex - + @@ -29257,7 +29110,7 @@

    Héritage et associations ex - + @@ -29273,7 +29126,7 @@

    Héritage et associations ex - + @@ -29287,7 +29140,7 @@

    Héritage et associations ex - + @@ -29301,7 +29154,7 @@

    Héritage et associations ex - + @@ -29316,7 +29169,7 @@

    Héritage et associations ex - + @@ -29331,7 +29184,7 @@

    Héritage et associations ex - + @@ -29346,7 +29199,7 @@

    Héritage et associations ex - + @@ -29440,7 +29293,7 @@

    Héritage et associations ex

    -
    In [105]:
    +
    In [104]:
    %%mocodo --relations diagram html_verbose
    @@ -29485,10 +29338,10 @@ 

    Héritage et associations ex
    - + - + 1,N @@ -29503,7 +29356,7 @@

    Héritage et associations ex - + 1,1 @@ -29518,7 +29371,7 @@

    Héritage et associations ex - + 1,1 @@ -29533,7 +29386,7 @@

    Héritage et associations ex - + @@ -29553,7 +29406,7 @@

    Héritage et associations ex - + 1,N @@ -29568,7 +29421,7 @@

    Héritage et associations ex - + 1,N @@ -29583,7 +29436,7 @@

    Héritage et associations ex - + 1,N @@ -29598,7 +29451,7 @@

    Héritage et associations ex - + @@ -29612,7 +29465,7 @@

    Héritage et associations ex - + @@ -29625,7 +29478,7 @@

    Héritage et associations ex - + @@ -29639,7 +29492,7 @@

    Héritage et associations ex - + @@ -29653,7 +29506,7 @@

    Héritage et associations ex - + @@ -29667,7 +29520,7 @@

    Héritage et associations ex - + @@ -29680,7 +29533,7 @@

    Héritage et associations ex - + @@ -29694,7 +29547,7 @@

    Héritage et associations ex - + @@ -29708,7 +29561,7 @@

    Héritage et associations ex - + @@ -29721,7 +29574,7 @@

    Héritage et associations ex - + @@ -29744,7 +29597,7 @@

    Héritage et associations ex

    -
    In [106]:
    +
    In [105]:
    display.HTML("mocodo_notebook/sandbox_verbose.html")
    @@ -29760,7 +29613,7 @@ 

    Héritage et associations ex
    -
    Out[106]:
    +
    Out[105]:
    @@ -29843,92 +29696,19 @@

    Héritage et associations ex

    -
    LIBERO ( - posuere, - lacrima - ) -
      -
    • Le champ posuere constitue la clé primaire de la table. C'était déjà un identifiant de l'entité LIBERO.
    • -
    • Le champ lacrima était déjà un simple attribut de l'entité LIBERO.
    • -
    +
    NEC ( - magna, - vestibulum, - #fermentum, - pulvinar, - audis, - #gravida - ) -
      -
    • Le champ magna constitue la clé primaire de la table. Il était clé primaire de l'entité-mère TRISTIS (supprimée).
    • -
    • Le champ vestibulum est un simple attribut. Il était simple attribut de l'entité-mère TRISTIS (supprimée).
    • -
    • Le champ fermentum est une clé étrangère. Il a migré à travers l'entité-mère TRISTIS (supprimée), et réfère maintenant directement à l'entité CONSEQUAT.
    • -
    • Les champs pulvinar et audis étaient déjà de simples attributs de l'entité NEC.
    • -
    • Le champ gravida est une clé étrangère. Il a migré par l'association de dépendance fonctionnelle MOLLIS à partir de l'entité CURABITUR en perdant son caractère identifiant.
    • -
    -
    -
    QUAM ( - cras, - sed, - #magna - ) -
      -
    • Le champ cras constitue la clé primaire de la table. C'était déjà un identifiant de l'entité QUAM.
    • -
    • Le champ sed était déjà un simple attribut de l'entité QUAM.
    • -
    • Le champ magna est une clé étrangère. Il a migré par l'association de dépendance fonctionnelle VITAE à partir de l'entité SODALES en perdant son caractère identifiant.
    • -
    -
    +
    -
    -
    SODALES ( - magna, - vestibulum, - #fermentum, - convallis, - ipsum - ) -
      -
    • Le champ magna constitue la clé primaire de la table. Il était clé primaire de l'entité-mère TRISTIS (supprimée).
    • -
    • Le champ vestibulum est un simple attribut. Il était simple attribut de l'entité-mère TRISTIS (supprimée).
    • -
    • Le champ fermentum est une clé étrangère. Il a migré à travers l'entité-mère TRISTIS (supprimée), et réfère maintenant directement à l'entité CONSEQUAT.
    • -
    • Les champs convallis et ipsum étaient déjà de simples attributs de l'entité SODALES.
    • -
    -
    +
    -
    -
    SUSCIPIT ( - orci, - lorem, - magna, - type - ) -
      -
    • Le champ orci constitue la clé primaire de la table. C'était déjà un identifiant de l'entité SUSCIPIT.
    • -
    • Le champ lorem était déjà un simple attribut de l'entité SUSCIPIT.
    • -
    • Le champ magna a migré par l'association de dépendance fonctionnelle RHONCUS à partir de l'entité TRISTIS (supprimée). Attention : aucune contrainte d'intégrité référentielle n'est plus assurée.
    • -
    • Un champ entier type est ajouté pour indiquer la nature de la spécialisation : 1 pour la première entité-fille, 2 pour la deuxième, etc. Jamais vide, du fait de la contrainte de totalité.
    • -
    -
    -
    -
    ULTRICES ( - #posuere, - #magna - ) -
      -
    • Le champ posuere fait partie de la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité LIBERO.
    • -
    • Le champ magna fait partie de la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité LACUS.
    • -
    -
    -
    - - +
    +limit_output extension: Maximum message size of 4000 exceeded with 9347 characters

    @@ -29939,7 +29719,7 @@

    Héritage et associations ex

    -
    In [107]:
    +
    In [106]:
    %mocodo --input mocodo_notebook/sandbox.mld
    @@ -29961,10 +29741,10 @@ 

    Héritage et associations ex
    - + - + @@ -29980,7 +29760,7 @@

    Héritage et associations ex - + @@ -29997,7 +29777,7 @@

    Héritage et associations ex - + @@ -30012,7 +29792,7 @@

    Héritage et associations ex - + @@ -30026,7 +29806,7 @@

    Héritage et associations ex - + @@ -30044,7 +29824,7 @@

    Héritage et associations ex - + @@ -30058,7 +29838,7 @@

    Héritage et associations ex - + @@ -30072,7 +29852,7 @@

    Héritage et associations ex - + @@ -30088,7 +29868,7 @@

    Héritage et associations ex - + @@ -30105,7 +29885,7 @@

    Héritage et associations ex - + @@ -30120,7 +29900,7 @@

    Héritage et associations ex - + @@ -30206,7 +29986,7 @@

    Héritage et associations in

    -
    In [108]:
    +
    In [107]:
    %%mocodo --relations diagram html_verbose
    @@ -30242,10 +30022,10 @@ 

    Héritage et associations in
    - + - + 1,N @@ -30260,7 +30040,7 @@

    Héritage et associations in - + @@ -30277,7 +30057,7 @@

    Héritage et associations in - + 1,1 @@ -30292,7 +30072,7 @@

    Héritage et associations in - + 1,N @@ -30307,7 +30087,7 @@

    Héritage et associations in - + @@ -30320,7 +30100,7 @@

    Héritage et associations in - + @@ -30333,7 +30113,7 @@

    Héritage et associations in - + @@ -30347,7 +30127,7 @@

    Héritage et associations in - + @@ -30364,23 +30144,23 @@

    Héritage et associations in - - - - + + + +

    @@ -30392,7 +30172,7 @@

    Héritage et associations in

    -
    In [109]:
    +
    In [108]:
    display.HTML("mocodo_notebook/sandbox_verbose.html")
    @@ -30408,7 +30188,7 @@ 

    Héritage et associations in
    -
    Out[109]:
    +
    Out[108]:
    @@ -30480,7 +30260,7 @@

    Héritage et associations in

    -
    In [110]:
    +
    In [109]:
    %mocodo --input mocodo_notebook/sandbox.mld
    @@ -30502,10 +30282,10 @@ 

    Héritage et associations in
    - + - + @@ -30528,7 +30308,7 @@

    Héritage et associations in - + @@ -30572,7 +30352,7 @@

    Héritage et associations in

    -
    In [111]:
    +
    In [110]:
    %%mocodo --relations diagram html_verbose
    @@ -30608,10 +30388,10 @@ 

    Héritage et associations in
    - + - + 1,N @@ -30626,7 +30406,7 @@

    Héritage et associations in - + @@ -30645,7 +30425,7 @@

    Héritage et associations in - + 1,1 @@ -30660,7 +30440,7 @@

    Héritage et associations in - + 1,N @@ -30675,7 +30455,7 @@

    Héritage et associations in - + @@ -30688,7 +30468,7 @@

    Héritage et associations in - + @@ -30701,7 +30481,7 @@

    Héritage et associations in - + @@ -30715,7 +30495,7 @@

    Héritage et associations in - + @@ -30732,23 +30512,23 @@

    Héritage et associations in - - - - + + + +

    @@ -30760,7 +30540,7 @@

    Héritage et associations in

    -
    In [112]:
    +
    In [111]:
    display.HTML("mocodo_notebook/sandbox_verbose.html")
    @@ -30776,7 +30556,7 @@ 

    Héritage et associations in
    -
    Out[112]:
    +
    Out[111]:
    @@ -30855,14 +30635,19 @@

    Héritage et associations in #magna lacus )
      -
    • Le champ magna sodales fait partie de la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité SODALES.
    • -
    • Le champ magna lacus fait partie de la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité LACUS.
    • -
    +
  • Le champ magna sodales fait partie de la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité SODALES<
  • - - + +
    + +
    + + + +
    +limit_output extension: Maximum message size of 4000 exceeded with 4226 characters
    @@ -30873,7 +30658,7 @@

    Héritage et associations in

    -
    In [113]:
    +
    In [112]:
    %mocodo --input mocodo_notebook/sandbox.mld
    @@ -30895,10 +30680,10 @@ 

    Héritage et associations in
    - + - + @@ -30915,7 +30700,7 @@

    Héritage et associations in - + @@ -30930,7 +30715,7 @@

    Héritage et associations in - + @@ -30945,7 +30730,7 @@

    Héritage et associations in - + @@ -30960,7 +30745,7 @@

    Héritage et associations in - + @@ -31019,7 +30804,7 @@

    Héritage et associations in

    -
    In [114]:
    +
    In [113]:
    %%mocodo --relations diagram html_verbose
    @@ -31055,10 +30840,10 @@ 

    Héritage et associations in
    - + - + 1,N @@ -31073,7 +30858,7 @@

    Héritage et associations in - + @@ -31093,7 +30878,7 @@

    Héritage et associations in - + 1,1 @@ -31108,7 +30893,7 @@

    Héritage et associations in - + 1,N @@ -31123,7 +30908,7 @@

    Héritage et associations in - + @@ -31136,7 +30921,7 @@

    Héritage et associations in - + @@ -31149,7 +30934,7 @@

    Héritage et associations in - + @@ -31163,7 +30948,7 @@

    Héritage et associations in - + @@ -31180,23 +30965,23 @@

    Héritage et associations in - - - - + + + +

    @@ -31208,7 +30993,7 @@

    Héritage et associations in

    -
    In [115]:
    +
    In [114]:
    display.HTML("mocodo_notebook/sandbox_verbose.html")
    @@ -31224,7 +31009,7 @@ 

    Héritage et associations in
    -
    Out[115]:
    +
    Out[114]:
    @@ -31297,13 +31082,19 @@

    Héritage et associations in )
    • Le champ magna sodales fait partie de la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité SODALES.
    • -
    • Le champ magna lacus fait partie de la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité LACUS.
    • -
    +
  • Le champ magna lacus fait partie de la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'enti
  • - - + +
    + +
    + + + +
    +limit_output extension: Maximum message size of 4000 exceeded with 4070 characters
    @@ -31314,7 +31105,7 @@

    Héritage et associations in

    -
    In [116]:
    +
    In [115]:
    %mocodo --input mocodo_notebook/sandbox.mld
    @@ -31336,10 +31127,10 @@ 

    Héritage et associations in
    - + - + @@ -31357,7 +31148,7 @@

    Héritage et associations in - + @@ -31373,56 +31164,563 @@

    Héritage et associations in - + - ULTRICES - #magna sodales - - #magna lacus - + ULTRICES + #magna sodales + + #magna lacus + + + + + + + + + + + + SODALES + magna + + vestibulum + convallis + ipsum + + + + + + + + + + + + + + + + + + + + + + +

    + +

    + +
    +
    + +
    +
    +
    +
    +

    Suppression des tables indépendantes réduites à leur clé primaire

    +
    +
    +
    +
    +
    +
    +

    Nouveauté de la version 3.1. À partir de la version 2.3.5, les tables réduites à une clé primaire non composite étaient supprimées. Dans le diagramme relationnel, les éventuelles clés étrangères correspondantes perdaient leur caractère étranger. Ainsi, dans le diagramme relationnel de l'introduction, les tables MATIÈRE et DATE disparaissaient et les clés étrangères libellé matière et date n'étaient pas préfixées d'un dièse ou accompagnées d'une flèche.

    +

    Ce mécanisme est maintenant étendu :

    +
      +
    • aux tables réduites à leur clé primaire, même composite, pourvu qu'aucun de ses composants ne soit clé étrangère ;
    • +
    • à tous les formats de sortie : précédemment, la suppression de ces tables n'était effective que dans le diagramme relationnel ; dans les autres formats, elles étaient juste passées en commentaire, tandis que leur clé primaire, lorsqu'elle migrait dans une autre table, n'en était pas moins préfixée d'un dièse.
    • +
    +

    Ainsi, dans le MLD ci-dessous :

    +
      +
    • la table DATE est supprimée (auparavant, elle était simplement masquée) ;
    • +
    • la table POSITION est également supprimée (auparavant, elle était conservée) ;
    • +
    • les clés des tables supprimées (Date, Latitude, Longitude) ne sont plus marquées comme étrangères dans ÉLÈVE ou ÉVALUER ;
    • +
    • la table ENSEIGNER est toujours conservée : quoique réduite à sa clé primaire, les composants de celle-ci sont des clés étrangères.
    • +
    + +
    +
    +
    +
    +
    +
    In [116]:
    +
    +
    +
    %%mocodo --mld --relations markdown_verbose
    +Prof: Num. prof, Nom prof
    +Enseigner, 1N Prof, 1N Élève
    +Élève: Num. élève, Nom élève
    +
    +Position: Latitude, _Longitude
    +Évaluer, 1N Élève, 0N Prof, 0N Position, 1N Date: Note
    +Date: Date
    +DF, 11 Élève, 0N Date
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    + + + +
    + + + + + + + 1,N + + 1,N + + + + + + Enseigner + + + + + + + 1,N + + 0,N + + 0,N + + 1,N + + + + + + Évaluer + Note + + + + + + + 1,1 + + 0,N + + + DF + + + + + + + + + + + + Prof + Num. prof + + Nom prof + + + + + + + + + + + Élève + Num. élève + + Nom élève + + + + + + + + + + + Position + Latitude + + Longitude + + + + + + + + + + + + Date + Date + + + +
    + +
    + +
    + +
    + + + +
    + + + + + + +
    +
    + Enseigner ( + #Num. prof, + #Num. élève + ) +
    +
    + Prof ( + Num. prof, + Nom prof + ) +
    +
    + Élève ( + Num. élève, + Nom élève, + Date + ) +
    +
    + Évaluer ( + #Num. élève, + #Num. prof, + Latitude, + Longitude, + Date, + Note + ) +
    +
    + + +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Les sorties « verbeuses » en HTML et Markdown expliquent le traitement des champs concernés (ci-dessous, ÉLÈVE / Date, ÉVALUER / Latitutde, Longitude et Date) et ajoutent une note de fin justifiant les suppressions (ci-dessous, NB).

    + +
    +
    +
    +
    +
    +
    In [117]:
    +
    +
    +
    display.Markdown("mocodo_notebook/sandbox_verbose.md")
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[117]:
    + + + +
    +

    Enseigner (_#Num. prof_, _#Num. élève_)

    +
      +
    • Le champ Num. prof fait partie de la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité Prof.
    • +
    • Le champ Num. élève fait partie de la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité Élève.
    • +
    +

    Prof (Num. prof, Nom prof)

    +
      +
    • Le champ Num. prof constitue la clé primaire de la table. C'était déjà un identifiant de l'entité Prof.
    • +
    • Le champ Nom prof était déjà un simple attribut de l'entité Prof.
    • +
    +

    Élève (Num. élève, Nom élève, #Date)

    +
      +
    • Le champ Num. élève constitue la clé primaire de la table. C'était déjà un identifiant de l'entité Élève.
    • +
    • Le champ Nom élève était déjà un simple attribut de l'entité Élève.
    • +
    • Le champ Date a migré par l'association de dépendance fonctionnelle DF à partir de l'entité Date en perdant son caractère identifiant. De plus, comme la table créée à partir de cette entité a été supprimée, il n'est pas considéré comme clé étrangère.
    • +
    +

    Évaluer (_#Num. élève_, _#Num. prof_, _#Latitude_, _#Longitude_, _#Date_, Note)

    +
      +
    • Le champ Num. élève fait partie de la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité Élève.
    • +
    • Le champ Num. prof fait partie de la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité Prof.
    • +
    • Les champs Latitude et Longitude font partie de la clé primaire de la table. Leur table d'origine (Position) ayant été supprimée, ils ne sont pas considérés comme clés étrangères.
    • +
    • Le champ Date fait partie de la clé primaire de la table. Sa table d'origine (Date) ayant été supprimée, il n'est pas considéré comme clé étrangère.
    • +
    • Le champ Note était déjà un simple attribut de l'association Évaluer.
    • +
    +
    +

    NB. Les tables Date et Position ont été supprimées car elles étaient réduites à la clé primaire de leur entité d'origine. Pour empêcher cette supression, préfixez d'un « + » le nom de l'entité.

    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Ce mécanisme est également devenu débrayable. Si l'on souhaite conserver une table indépendante réduite à sa clé primaire, on préfixe du signe « + » l'entité correspondante (ci-dessous, POSITION). Pour les tables non supprimables, ce préfixe est simplement ignoré (ci-dessous, PROF).

    + +
    +
    +
    +
    +
    +
    In [118]:
    +
    +
    +
    %%mocodo --mld
    ++Prof: Num. prof, Nom prof
    +Enseigner, 1N Prof, 1N Élève
    +Élève: Num. élève, Nom élève
    +
    ++Position: Latitude, _Longitude
    +Évaluer, 1N Élève, 0N Prof, 0N Position, 1N Date: Note
    +Date: Date
    +DF, 11 Élève, 0N Date
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    + + + +
    + + + + + + + 1,N + + 1,N + + + + + + Enseigner + + + + + + + 1,N + + 0,N + + 0,N + + 1,N + + + + + + Évaluer + Note + + + + + + + 1,1 + + 0,N + + + DF + + + + + + + + + + + + Prof + Num. prof + + Nom prof + + + + + + + + + + + Élève + Num. élève + + Nom élève + + + + + + + + + + + Position + Latitude + + Longitude + - - + + - - - - + + + + - SODALES - magna - - vestibulum - convallis - ipsum + Date + Date + + +
    - - - - +
    - - - - +
    - - - - +
    - - - - - + + +
    + + + + + + +
    +
    + Enseigner ( + #Num. prof, + #Num. élève + ) +
    +
    + Position ( + Latitude, + Longitude + ) +
    +
    + Prof ( + Num. prof, + Nom prof + ) +
    +
    + Élève ( + Num. élève, + Nom élève, + Date + ) +
    +
    + Évaluer ( + #Num. élève, + #Num. prof, + #Latitude, + #Longitude, + Date, + Note + ) +
    +
    + +
    @@ -31430,6 +31728,14 @@

    Héritage et associations in

    +
    +
    +
    +
    +

    Pour une discussion sur cette problématique, cf. issue #66.

    + +
    +
    @@ -31475,7 +31781,7 @@

    Formats linéaires
    -
    In [117]:
    +
    In [119]:
    %%mocodo --relations latex
    @@ -31502,10 +31808,10 @@ 

    Formats linéaires - + - + 0,N @@ -31517,7 +31823,7 @@

    Formats linéaires - + 1,N @@ -31533,7 +31839,7 @@

    Formats linéaires - + @@ -31549,7 +31855,7 @@

    Formats linéaires - + @@ -31564,7 +31870,7 @@

    Formats linéaires - + @@ -31588,7 +31894,7 @@

    Formats linéaires
    -
    In [118]:
    +
    In [120]:
    -
    In [119]:
    +
    In [121]:
    %%mocodo --relations markdown_verbose
    @@ -31798,10 +32082,10 @@ 

    Formats linéaires avec ex
    - + - + 0,N @@ -31813,7 +32097,7 @@

    Formats linéaires avec ex - + 1,N @@ -31829,7 +32113,7 @@

    Formats linéaires avec ex - + @@ -31845,7 +32129,7 @@

    Formats linéaires avec ex - + @@ -31860,7 +32144,7 @@

    Formats linéaires avec ex - + @@ -31884,7 +32168,7 @@

    Formats linéaires avec ex

    -
    In [120]:
    +
    In [122]:
    display.Markdown("mocodo_notebook/sandbox_verbose.md")
    @@ -31900,7 +32184,7 @@ 

    Formats linéaires avec ex
    -
    Out[120]:
    +
    Out[122]:
    @@ -31946,7 +32230,7 @@

    Formats linéaires avec ex

    -
    In [121]:
    +
    In [123]:
    %%mocodo --relations html_verbose
    @@ -31973,10 +32257,10 @@ 

    Formats linéaires avec ex
    - + - + 0,N @@ -31988,7 +32272,7 @@

    Formats linéaires avec ex - + 1,N @@ -32004,7 +32288,7 @@

    Formats linéaires avec ex - + @@ -32020,7 +32304,7 @@

    Formats linéaires avec ex - + @@ -32035,7 +32319,7 @@

    Formats linéaires avec ex - + @@ -32059,7 +32343,7 @@

    Formats linéaires avec ex

    -
    In [122]:
    +
    In [124]:
    display.HTML("mocodo_notebook/sandbox_verbose.html")
    @@ -32075,7 +32359,7 @@ 

    Formats linéaires avec ex
    -
    Out[122]:
    +
    Out[124]:
    @@ -32187,7 +32471,7 @@

    Diagramme relationnel
    -
    In [123]:
    +
    In [125]:
    %%mocodo --relations diagram
    @@ -32214,10 +32498,10 @@ 

    Diagramme relationnel - + - + 0,N @@ -32229,7 +32513,7 @@

    Diagramme relationnel - + 1,N @@ -32245,7 +32529,7 @@

    Diagramme relationnel - + @@ -32261,7 +32545,7 @@

    Diagramme relationnel - + @@ -32276,7 +32560,7 @@

    Diagramme relationnel - + @@ -32300,7 +32584,7 @@

    Diagramme relationnel
    -
    In [124]:
    +
    In [126]:
    %mocodo --input mocodo_notebook/sandbox.mld
    @@ -32322,10 +32606,10 @@ 

    Diagramme relationnel - + - + @@ -32341,7 +32625,7 @@

    Diagramme relationnel - + @@ -32357,7 +32641,7 @@

    Diagramme relationnel - + @@ -32373,7 +32657,7 @@

    Diagramme relationnel - + @@ -32412,7 +32696,7 @@

    Diagramme relationnel
    -
    In [125]:
    +
    In [127]:
    + +
    +
    + + + +
    +limit_output extension: Maximum message size of 4000 exceeded with 5320 characters
    @@ -32538,7 +32809,7 @@

    Diagramme relationnel
    -
    In [126]:
    +
    In [128]:
    %%mocodo --relations diagram
    @@ -32569,10 +32840,10 @@ 

    Diagramme relationnel - + - + @@ -32588,7 +32859,7 @@

    Diagramme relationnel - + @@ -32604,7 +32875,7 @@

    Diagramme relationnel - + @@ -32620,7 +32891,7 @@

    Diagramme relationnel - + @@ -32667,7 +32938,7 @@

    Diagramme relationnel
    -
    In [128]:
    +
    In [130]:
    %%mocodo --title=client_commande_produit --relations mysql
    @@ -32885,10 +33148,10 @@ 

    Sorties SQL
    -
    In [129]:
    +
    In [131]:
    display.Code(filename="mocodo_notebook/sandbox_mysql.sql", language="mysql")
    @@ -32994,7 +33257,7 @@ 

    Sorties SQL
    -
    Out[129]:
    +
    Out[131]:
    @@ -33058,57 +33321,19 @@

    Sorties SQL¶ .output_html .sc { color: #BA2121 } /* Literal.String.Char */ .output_html .dl { color: #BA2121 } /* Literal.String.Delimiter */ .output_html .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ -.output_html .s2 { color: #BA2121 } /* Literal.String.Double */ -.output_html .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ -.output_html .sh { color: #BA2121 } /* Literal.String.Heredoc */ -.output_html .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ -.output_html .sx { color: #008000 } /* Literal.String.Other */ -.output_html .sr { color: #A45A77 } /* Literal.String.Regex */ -.output_html .s1 { color: #BA2121 } /* Literal.String.Single */ -.output_html .ss { color: #19177C } /* Literal.String.Symbol */ -.output_html .bp { color: #008000 } /* Name.Builtin.Pseudo */ -.output_html .fm { color: #0000FF } /* Name.Function.Magic */ -.output_html .vc { color: #19177C } /* Name.Variable.Class */ -.output_html .vg { color: #19177C } /* Name.Variable.Global */ -.output_html .vi { color: #19177C } /* Name.Variable.Instance */ -.output_html .vm { color: #19177C } /* Name.Variable.Magic */ -.output_html .il { color: #666666 } /* Literal.Number.Integer.Long */
    CREATE DATABASE IF NOT EXISTS `CLIENT_COMMANDE_PRODUIT` DEFAULT CHARACTER SET UTF8MB4 COLLATE utf8_general_ci;
    -USE `CLIENT_COMMANDE_PRODUIT`;
    -
    -CREATE TABLE `CLIENT` (
    -  `réf_client` varchar(8),
    -  `nom` varchar(20),
    -  `adresse` varchar(40),
    -  PRIMARY KEY (`réf_client`)
    -) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4;
    -
    -CREATE TABLE `COMMANDE` (
    -  `num_commande` tinyint(4),
    -  `date` date,
    -  `montant` decimal(5,2) DEFAULT '0.00',
    -  `réf_client` varchar(8),
    -  PRIMARY KEY (`num_commande`)
    -) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4;
    -
    -CREATE TABLE `INCLURE` (
    -  `num_commande` tinyint(4),
    -  `réf_produit` varchar(8),
    -  `quantité` tinyint(4),
    -  PRIMARY KEY (`num_commande`, `réf_produit`)
    -) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4;
    -
    -CREATE TABLE `PRODUIT` (
    -  `réf_produit` varchar(8),
    -  `libellé` varchar(20),
    -  `prix_unitaire` decimal(5,2),
    -  PRIMARY KEY (`réf_produit`)
    -) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4;
    -
    -ALTER TABLE `COMMANDE` ADD FOREIGN KEY (`réf_client`) REFERENCES `CLIENT` (`réf_client`);
    -ALTER TABLE `INCLURE` ADD FOREIGN KEY (`réf_produit`) REFERENCES `PRODUIT` (`réf_produit`);
    -ALTER TABLE `INCLURE` ADD FOREIGN KEY (`num_commande`) REFERENCES `COMMANDE` (`num_commande`);
    -
    +.output_html .s2 { color: #BA212 +

    + +

    + +
    + +
    + + +
    +limit_output extension: Maximum message size of 4000 exceeded with 14290 characters
    @@ -33127,7 +33352,7 @@

    Sorties SQL

    -
    In [130]:
    +
    In [132]:
    %%mocodo --title=appartements --relations sqlite
    @@ -33156,10 +33381,10 @@ 

    Sorties SQL
    -
    In [131]:
    +
    In [133]:
    display.Code("mocodo_notebook/sandbox_sqlite.sql")
    @@ -33288,7 +33513,7 @@ 

    Sorties SQL
    -
    Out[131]:
    +
    Out[133]:
    @@ -33352,58 +33577,21 @@

    Sorties SQL¶ .output_html .sc { color: #BA2121 } /* Literal.String.Char */ .output_html .dl { color: #BA2121 } /* Literal.String.Delimiter */ .output_html .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ -.output_html .s2 { color: #BA2121 } /* Literal.String.Double */ -.output_html .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ -.output_html .sh { color: #BA2121 } /* Literal.String.Heredoc */ -.output_html .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ -.output_html .sx { color: #008000 } /* Literal.String.Other */ -.output_html .sr { color: #A45A77 } /* Literal.String.Regex */ -.output_html .s1 { color: #BA2121 } /* Literal.String.Single */ -.output_html .ss { color: #19177C } /* Literal.String.Symbol */ -.output_html .bp { color: #008000 } /* Name.Builtin.Pseudo */ -.output_html .fm { color: #0000FF } /* Name.Function.Magic */ -.output_html .vc { color: #19177C } /* Name.Variable.Class */ -.output_html .vg { color: #19177C } /* Name.Variable.Global */ -.output_html .vi { color: #19177C } /* Name.Variable.Instance */ -.output_html .vm { color: #19177C } /* Name.Variable.Magic */ -.output_html .il { color: #666666 } /* Literal.Number.Integer.Long */
    .open "APPARTEMENTS";
    -
    -CREATE TABLE "APPARTEMENT" (
    -  "code_rue" VARCHAR(42),
    -  "num_immeuble" VARCHAR(42),
    -  "num_étage" VARCHAR(42),
    -  "num_appart" VARCHAR(42),
    -  "nb_pièces_appart" VARCHAR(42),
    -  PRIMARY KEY ("code_rue", "num_immeuble", "num_étage", "num_appart"),
    -  FOREIGN KEY ("code_rue", "num_immeuble", "num_étage") REFERENCES "ÉTAGE" ("code_rue", "num_immeuble", "num_étage")
    -);
    -
    -CREATE TABLE "IMMEUBLE" (
    -  "code_rue" VARCHAR(42),
    -  "num_immeuble" VARCHAR(42),
    -  "nb_étages_immeuble" VARCHAR(42),
    -  PRIMARY KEY ("code_rue", "num_immeuble"),
    -  FOREIGN KEY ("code_rue") REFERENCES "RUE" ("code_rue")
    -);
    -
    -CREATE TABLE "RUE" (
    -  "code_rue" VARCHAR(42),
    -  "nom_rue" VARCHAR(42),
    -  PRIMARY KEY ("code_rue")
    -);
    -
    -CREATE TABLE "ÉTAGE" (
    -  "code_rue" VARCHAR(42),
    -  "num_immeuble" VARCHAR(42),
    -  "num_étage" VARCHAR(42),
    -  "nb_appart_étage" VARCHAR(42),
    -  PRIMARY KEY ("code_rue", "num_immeuble", "num_étage"),
    -  FOREIGN KEY ("code_rue", "num_immeuble") REFERENCES "IMMEUBLE" ("code_rue", "num_immeuble")
    -);
    -
    +.output_html .s2 { color: #BA212 +

    +
    + +
    + + + +
    +limit_output extension: Maximum message size of 4000 exceeded with 13013 characters +
    +
    @@ -33427,7 +33615,7 @@

    Dictionnaire des données (bo

    -
    In [132]:
    +
    In [134]:
    %%mocodo --no_mcd --relations markdown_data_dict
    @@ -33445,7 +33633,7 @@ 

    Dictionnaire des données (bo

    -
    In [133]:
    +
    In [135]:
    display.Markdown("mocodo_notebook/sandbox_data_dict.md")
    @@ -33461,7 +33649,7 @@ 

    Dictionnaire des données (bo
    -
    Out[133]:
    +
    Out[135]:
    @@ -33534,7 +33722,7 @@

    Dictionnaire des données (bo

    -
    In [134]:
    +
    In [136]:
    %%mocodo --no_mcd --relations markdown_data_dict
    @@ -33552,7 +33740,7 @@ 

    Dictionnaire des données (bo

    -
    In [135]:
    +
    In [137]:
    display.Markdown("mocodo_notebook/sandbox_data_dict.md")
    @@ -33568,7 +33756,7 @@ 

    Dictionnaire des données (bo
    -
    Out[135]:
    +
    Out[137]:
    @@ -33699,7 +33887,6 @@

    Algorithme
  • "column_separator" joint chacune de ces listes de chaînes et associe le résultat à l'identificateur "columns" et "sorted_columns" (respectivement).
  • "compose_relation" construit une relation complète avec tous ses attributs. Par exemple, et c'est la valeur par défaut, "{this_relation_name} ({columns})" est utilisé dans les formats linéaires.
  • -
  • "transform_single_column_relation" s'applique à ce dernier résultat lorsque la relation est réduite à un seul attribut (l'usage est d'en proposer la suppression en la mettant en commentaire).
  • "transform_forced_relation" est appliqué aux associations DF dont la conversion en table a été forcée manuellement.
  • "transform_relation" est appliqué systématiquement, et le résultat est accumulé dans une liste de relations, en deux versions: dans l'ordre de leur énumération, ou triée selon la clé spécifiée dans "relation_sorting_key".
  • @@ -33729,7 +33916,7 @@

    Identif

    -
    In [136]:
    +
    In [138]:
    %%mocodo --title client_commande_produit --relations json
    @@ -33756,10 +33943,10 @@ 

    Identif
    - + - + 0,N @@ -33771,7 +33958,7 @@

    Identif - + 1,N @@ -33787,7 +33974,7 @@

    Identif - + @@ -33803,7 +33990,7 @@

    Identif - + @@ -33818,7 +34005,7 @@

    Identif - + @@ -33857,7 +34044,7 @@

    Identif

    -
    In [137]:
    +
    In [139]:
    display.Code("mocodo_notebook/sandbox.json")
    @@ -33873,7 +34060,7 @@ 

    Identif
    -
    Out[137]:
    +
    Out[139]:
    @@ -33937,402 +34124,19 @@

    Identif .output_html .sc { color: #BA2121 } /* Literal.String.Char */ .output_html .dl { color: #BA2121 } /* Literal.String.Delimiter */ .output_html .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ -.output_html .s2 { color: #BA2121 } /* Literal.String.Double */ -.output_html .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ -.output_html .sh { color: #BA2121 } /* Literal.String.Heredoc */ -.output_html .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ -.output_html .sx { color: #008000 } /* Literal.String.Other */ -.output_html .sr { color: #A45A77 } /* Literal.String.Regex */ -.output_html .s1 { color: #BA2121 } /* Literal.String.Single */ -.output_html .ss { color: #19177C } /* Literal.String.Symbol */ -.output_html .bp { color: #008000 } /* Name.Builtin.Pseudo */ -.output_html .fm { color: #0000FF } /* Name.Function.Magic */ -.output_html .vc { color: #19177C } /* Name.Variable.Class */ -.output_html .vg { color: #19177C } /* Name.Variable.Global */ -.output_html .vi { color: #19177C } /* Name.Variable.Instance */ -.output_html .vm { color: #19177C } /* Name.Variable.Magic */ -.output_html .il { color: #666666 } /* Literal.Number.Integer.Long */
    {
    -  "title": "client_commande_produit",
    -  "title_lowercase": "client_commande_produit",
    -  "title_uppercase": "CLIENT_COMMANDE_PRODUIT",
    -  "title_titlecase": "Client_commande_produit",
    -  "relations": [
    -    {
    -      "this_relation_name": "CLIENT",
    -      "this_relation_name_lowercase": "client",
    -      "this_relation_name_uppercase": "CLIENT",
    -      "this_relation_name_titlecase": "Client",
    -      "is_forced": "False",
    -      "columns": [
    -        {
    -          "attribute": "Réf. client",
    -          "raw_label": "Réf. client",
    -          "raw_label_lowercase": "réf. client",
    -          "raw_label_uppercase": "RÉF. CLIENT",
    -          "raw_label_titlecase": "Réf. client",
    -          "disambiguation_number": null,
    -          "label": "Réf. client",
    -          "label_lowercase": "réf. client",
    -          "label_uppercase": "RÉF. CLIENT",
    -          "label_titlecase": "Réf. client",
    -          "primary": true,
    -          "nature": "primary_key",
    -          "data_type": null,
    -          "association_name": null,
    -          "association_name_lower_case": null,
    -          "association_name_uppercase": null,
    -          "association_name_titlecase": null,
    -          "leg_note": null,
    -          "outer_source": null,
    -          "outer_source_lowercase": null,
    -          "outer_source_uppercase": null,
    -          "outer_source_titlecase": null
    -        },
    -        {
    -          "attribute": "Nom",
    -          "raw_label": "Nom",
    -          "raw_label_lowercase": "nom",
    -          "raw_label_uppercase": "NOM",
    -          "raw_label_titlecase": "Nom",
    -          "disambiguation_number": null,
    -          "label": "Nom",
    -          "label_lowercase": "nom",
    -          "label_uppercase": "NOM",
    -          "label_titlecase": "Nom",
    -          "primary": false,
    -          "nature": "normal_attribute",
    -          "data_type": null,
    -          "association_name": null,
    -          "association_name_lower_case": null,
    -          "association_name_uppercase": null,
    -          "association_name_titlecase": null,
    -          "leg_note": null,
    -          "outer_source": null,
    -          "outer_source_lowercase": null,
    -          "outer_source_uppercase": null,
    -          "outer_source_titlecase": null
    -        },
    -        {
    -          "attribute": "Prénom",
    -          "raw_label": "Prénom",
    -          "raw_label_lowercase": "prénom",
    -          "raw_label_uppercase": "PRÉNOM",
    -          "raw_label_titlecase": "Prénom",
    -          "disambiguation_number": null,
    -          "label": "Prénom",
    -          "label_lowercase": "prénom",
    -          "label_uppercase": "PRÉNOM",
    -          "label_titlecase": "Prénom",
    -          "primary": false,
    -          "nature": "normal_attribute",
    -          "data_type": null,
    -          "association_name": null,
    -          "association_name_lower_case": null,
    -          "association_name_uppercase": null,
    -          "association_name_titlecase": null,
    -          "leg_note": null,
    -          "outer_source": null,
    -          "outer_source_lowercase": null,
    -          "outer_source_uppercase": null,
    -          "outer_source_titlecase": null
    -        },
    -        {
    -          "attribute": "Adresse",
    -          "raw_label": "Adresse",
    -          "raw_label_lowercase": "adresse",
    -          "raw_label_uppercase": "ADRESSE",
    -          "raw_label_titlecase": "Adresse",
    -          "disambiguation_number": null,
    -          "label": "Adresse",
    -          "label_lowercase": "adresse",
    -          "label_uppercase": "ADRESSE",
    -          "label_titlecase": "Adresse",
    -          "primary": false,
    -          "nature": "normal_attribute",
    -          "data_type": null,
    -          "association_name": null,
    -          "association_name_lower_case": null,
    -          "association_name_uppercase": null,
    -          "association_name_titlecase": null,
    -          "leg_note": null,
    -          "outer_source": null,
    -          "outer_source_lowercase": null,
    -          "outer_source_uppercase": null,
    -          "outer_source_titlecase": null
    -        }
    -      ]
    -    },
    -    {
    -      "this_relation_name": "COMMANDE",
    -      "this_relation_name_lowercase": "commande",
    -      "this_relation_name_uppercase": "COMMANDE",
    -      "this_relation_name_titlecase": "Commande",
    -      "is_forced": "False",
    -      "columns": [
    -        {
    -          "attribute": "Num commande",
    -          "raw_label": "Num commande",
    -          "raw_label_lowercase": "num commande",
    -          "raw_label_uppercase": "NUM COMMANDE",
    -          "raw_label_titlecase": "Num commande",
    -          "disambiguation_number": null,
    -          "label": "Num commande",
    -          "label_lowercase": "num commande",
    -          "label_uppercase": "NUM COMMANDE",
    -          "label_titlecase": "Num commande",
    -          "primary": true,
    -          "nature": "primary_key",
    -          "data_type": null,
    -          "association_name": null,
    -          "association_name_lower_case": null,
    -          "association_name_uppercase": null,
    -          "association_name_titlecase": null,
    -          "leg_note": null,
    -          "outer_source": null,
    -          "outer_source_lowercase": null,
    -          "outer_source_uppercase": null,
    -          "outer_source_titlecase": null
    -        },
    -        {
    -          "attribute": "Date",
    -          "raw_label": "Date",
    -          "raw_label_lowercase": "date",
    -          "raw_label_uppercase": "DATE",
    -          "raw_label_titlecase": "Date",
    -          "disambiguation_number": null,
    -          "label": "Date",
    -          "label_lowercase": "date",
    -          "label_uppercase": "DATE",
    -          "label_titlecase": "Date",
    -          "primary": false,
    -          "nature": "normal_attribute",
    -          "data_type": null,
    -          "association_name": null,
    -          "association_name_lower_case": null,
    -          "association_name_uppercase": null,
    -          "association_name_titlecase": null,
    -          "leg_note": null,
    -          "outer_source": null,
    -          "outer_source_lowercase": null,
    -          "outer_source_uppercase": null,
    -          "outer_source_titlecase": null
    -        },
    -        {
    -          "attribute": "Montant",
    -          "raw_label": "Montant",
    -          "raw_label_lowercase": "montant",
    -          "raw_label_uppercase": "MONTANT",
    -          "raw_label_titlecase": "Montant",
    -          "disambiguation_number": null,
    -          "label": "Montant",
    -          "label_lowercase": "montant",
    -          "label_uppercase": "MONTANT",
    -          "label_titlecase": "Montant",
    -          "primary": false,
    -          "nature": "normal_attribute",
    -          "data_type": null,
    -          "association_name": null,
    -          "association_name_lower_case": null,
    -          "association_name_uppercase": null,
    -          "association_name_titlecase": null,
    -          "leg_note": null,
    -          "outer_source": null,
    -          "outer_source_lowercase": null,
    -          "outer_source_uppercase": null,
    -          "outer_source_titlecase": null
    -        },
    -        {
    -          "attribute": "Réf. client",
    -          "raw_label": "Réf. client",
    -          "raw_label_lowercase": "réf. client",
    -          "raw_label_uppercase": "RÉF. CLIENT",
    -          "raw_label_titlecase": "Réf. client",
    -          "disambiguation_number": null,
    -          "label": "Réf. client",
    -          "label_lowercase": "réf. client",
    -          "label_uppercase": "RÉF. CLIENT",
    -          "label_titlecase": "Réf. client",
    -          "primary": false,
    -          "nature": "foreign_key",
    -          "data_type": null,
    -          "association_name": "DF",
    -          "association_name_lower_case": "df",
    -          "association_name_uppercase": "DF",
    -          "association_name_titlecase": "Df",
    -          "leg_note": null,
    -          "outer_source": "CLIENT",
    -          "outer_source_lowercase": "client",
    -          "outer_source_uppercase": "CLIENT",
    -          "outer_source_titlecase": "Client"
    -        }
    -      ]
    -    },
    -    {
    -      "this_relation_name": "INCLURE",
    -      "this_relation_name_lowercase": "inclure",
    -      "this_relation_name_uppercase": "INCLURE",
    -      "this_relation_name_titlecase": "Inclure",
    -      "is_forced": "False",
    -      "columns": [
    -        {
    -          "attribute": "Num commande",
    -          "raw_label": "Num commande",
    -          "raw_label_lowercase": "num commande",
    -          "raw_label_uppercase": "NUM COMMANDE",
    -          "raw_label_titlecase": "Num commande",
    -          "disambiguation_number": null,
    -          "label": "Num commande",
    -          "label_lowercase": "num commande",
    -          "label_uppercase": "NUM COMMANDE",
    -          "label_titlecase": "Num commande",
    -          "primary": true,
    -          "nature": "primary_foreign_key",
    -          "data_type": null,
    -          "association_name": "INCLURE",
    -          "association_name_lower_case": "inclure",
    -          "association_name_uppercase": "INCLURE",
    -          "association_name_titlecase": "Inclure",
    -          "leg_note": null,
    -          "outer_source": "COMMANDE",
    -          "outer_source_lowercase": "commande",
    -          "outer_source_uppercase": "COMMANDE",
    -          "outer_source_titlecase": "Commande"
    -        },
    -        {
    -          "attribute": "Réf. produit",
    -          "raw_label": "Réf. produit",
    -          "raw_label_lowercase": "réf. produit",
    -          "raw_label_uppercase": "RÉF. PRODUIT",
    -          "raw_label_titlecase": "Réf. produit",
    -          "disambiguation_number": null,
    -          "label": "Réf. produit",
    -          "label_lowercase": "réf. produit",
    -          "label_uppercase": "RÉF. PRODUIT",
    -          "label_titlecase": "Réf. produit",
    -          "primary": true,
    -          "nature": "primary_foreign_key",
    -          "data_type": null,
    -          "association_name": "INCLURE",
    -          "association_name_lower_case": "inclure",
    -          "association_name_uppercase": "INCLURE",
    -          "association_name_titlecase": "Inclure",
    -          "leg_note": null,
    -          "outer_source": "PRODUIT",
    -          "outer_source_lowercase": "produit",
    -          "outer_source_uppercase": "PRODUIT",
    -          "outer_source_titlecase": "Produit"
    -        },
    -        {
    -          "attribute": "Quantité",
    -          "raw_label": "Quantité",
    -          "raw_label_lowercase": "quantité",
    -          "raw_label_uppercase": "QUANTITÉ",
    -          "raw_label_titlecase": "Quantité",
    -          "disambiguation_number": null,
    -          "label": "Quantité",
    -          "label_lowercase": "quantité",
    -          "label_uppercase": "QUANTITÉ",
    -          "label_titlecase": "Quantité",
    -          "primary": false,
    -          "nature": "association_attribute",
    -          "data_type": null,
    -          "association_name": "INCLURE",
    -          "association_name_lower_case": "inclure",
    -          "association_name_uppercase": "INCLURE",
    -          "association_name_titlecase": "Inclure",
    -          "leg_note": null,
    -          "outer_source": null,
    -          "outer_source_lowercase": null,
    -          "outer_source_uppercase": null,
    -          "outer_source_titlecase": null
    -        }
    -      ]
    -    },
    -    {
    -      "this_relation_name": "PRODUIT",
    -      "this_relation_name_lowercase": "produit",
    -      "this_relation_name_uppercase": "PRODUIT",
    -      "this_relation_name_titlecase": "Produit",
    -      "is_forced": "False",
    -      "columns": [
    -        {
    -          "attribute": "Réf. produit",
    -          "raw_label": "Réf. produit",
    -          "raw_label_lowercase": "réf. produit",
    -          "raw_label_uppercase": "RÉF. PRODUIT",
    -          "raw_label_titlecase": "Réf. produit",
    -          "disambiguation_number": null,
    -          "label": "Réf. produit",
    -          "label_lowercase": "réf. produit",
    -          "label_uppercase": "RÉF. PRODUIT",
    -          "label_titlecase": "Réf. produit",
    -          "primary": true,
    -          "nature": "primary_key",
    -          "data_type": null,
    -          "association_name": null,
    -          "association_name_lower_case": null,
    -          "association_name_uppercase": null,
    -          "association_name_titlecase": null,
    -          "leg_note": null,
    -          "outer_source": null,
    -          "outer_source_lowercase": null,
    -          "outer_source_uppercase": null,
    -          "outer_source_titlecase": null
    -        },
    -        {
    -          "attribute": "Libellé",
    -          "raw_label": "Libellé",
    -          "raw_label_lowercase": "libellé",
    -          "raw_label_uppercase": "LIBELLÉ",
    -          "raw_label_titlecase": "Libellé",
    -          "disambiguation_number": null,
    -          "label": "Libellé",
    -          "label_lowercase": "libellé",
    -          "label_uppercase": "LIBELLÉ",
    -          "label_titlecase": "Libellé",
    -          "primary": false,
    -          "nature": "normal_attribute",
    -          "data_type": null,
    -          "association_name": null,
    -          "association_name_lower_case": null,
    -          "association_name_uppercase": null,
    -          "association_name_titlecase": null,
    -          "leg_note": null,
    -          "outer_source": null,
    -          "outer_source_lowercase": null,
    -          "outer_source_uppercase": null,
    -          "outer_source_titlecase": null
    -        },
    -        {
    -          "attribute": "Prix unitaire",
    -          "raw_label": "Prix unitaire",
    -          "raw_label_lowercase": "prix unitaire",
    -          "raw_label_uppercase": "PRIX UNITAIRE",
    -          "raw_label_titlecase": "Prix unitaire",
    -          "disambiguation_number": null,
    -          "label": "Prix unitaire",
    -          "label_lowercase": "prix unitaire",
    -          "label_uppercase": "PRIX UNITAIRE",
    -          "label_titlecase": "Prix unitaire",
    -          "primary": false,
    -          "nature": "normal_attribute",
    -          "data_type": null,
    -          "association_name": null,
    -          "association_name_lower_case": null,
    -          "association_name_uppercase": null,
    -          "association_name_titlecase": null,
    -          "leg_note": null,
    -          "outer_source": null,
    -          "outer_source_lowercase": null,
    -          "outer_source_uppercase": null,
    -          "outer_source_titlecase": null
    -        }
    -      ]
    -    }
    -  ]
    -}
    -
    +.output_html .s2 { color: #BA212 +

    + +

    +
    + +
    + + + +
    +limit_output extension: Maximum message size of 4000 exceeded with 81459 characters
    @@ -34374,7 +34178,7 @@

    Composition des attributs s

    -
    In [138]:
    +
    In [140]:
    %%mocodo --relations html_verbose
    @@ -34401,10 +34205,10 @@ 

    Composition des attributs s
    - + - + 1,1 @@ -34420,7 +34224,7 @@

    Composition des attributs s - + 1,N @@ -34436,7 +34240,7 @@

    Composition des attributs s - + @@ -34449,7 +34253,7 @@

    Composition des attributs s - + @@ -34463,7 +34267,7 @@

    Composition des attributs s - + @@ -34485,7 +34289,7 @@

    Composition des attributs s

    -
    In [139]:
    +
    In [141]:
    display.HTML("mocodo_notebook/sandbox_verbose.html")
    @@ -34501,7 +34305,7 @@ 

    Composition des attributs s
    -
    Out[139]:
    +
    Out[141]:
    @@ -34525,50 +34329,30 @@

    Composition des attributs s
    Form ( land, hide, - #clue, + clue, goat )
    • Le champ land constitue la clé primaire de la table. C'était déjà un identifiant de l'entité Form.
    • Le champ hide était déjà un simple attribut de l'entité Form.
    • -
    • Le champ clue est une clé étrangère. Il a migré par l'association de dépendance fonctionnelle Into à partir de l'entité Riot en perdant son caractère identifiant.
    • +
    • Le champ clue a migré par l'association de dépendance fonctionnelle Into à partir de l'entité Riot en perdant son caractère identifiant. De plus, comme la table créée à partir de cette entité a été supprimée, il n'est pas considéré comme clé étrangère.
    • Le champ goat a migré à partir de l'association de dépendance fonctionnelle Into.

    -
    -
    Read ( - wage - ) -
      -
    • Avertissement. Cette table ne comportant qu'un seul champ, on peut envisager de la supprimer.
    • -
    • Le champ wage constitue la clé primaire de la table. C'était déjà un identifiant de l'entité Read.
    • -
    -
    - -
    -
    Riot ( - clue - ) -
      -
    • Avertissement. Cette table ne comportant qu'un seul champ, on peut envisager de la supprimer.
    • -
    • Le champ clue constitue la clé primaire de la table. C'était déjà un identifiant de l'entité Riot.
    • -
    -
    -
    Tuck ( - #wage, + wage, #land, thin )
      -
    • Le champ wage fait partie de la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité Read.
    • +
    • Le champ wage fait partie de la clé primaire de la table. Sa table d'origine (Read) ayant été supprimée, il n'est pas considéré comme clé étrangère.
    • Le champ land fait partie de la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité Form.
    • Le champ thin était déjà un simple attribut de l'association Tuck.
    - +


    NB. Les tables Read et Riot ont été supprimées car elles étaient réduites à la clé primaire de leur entité d'origine. Pour empêcher cette supression, préfixez d'un « + » le nom de l'entité.

    @@ -34636,7 +34420,7 @@

    Composition des attributs s

    -
    In [140]:
    +
    In [142]:
    %%mocodo --relations html_verbose
    @@ -34665,10 +34449,10 @@ 

    Composition des attributs s
    - + - + 1,N @@ -34684,7 +34468,7 @@

    Composition des attributs s - + 1,N @@ -34701,7 +34485,7 @@

    Composition des attributs s - + 1,1 @@ -34717,7 +34501,7 @@

    Composition des attributs s - + @@ -34730,7 +34514,7 @@

    Composition des attributs s - + @@ -34743,7 +34527,7 @@

    Composition des attributs s - + @@ -34756,7 +34540,7 @@

    Composition des attributs s - + @@ -34778,7 +34562,7 @@

    Composition des attributs s

    -
    In [141]:
    +
    In [143]:
    display.HTML("mocodo_notebook/sandbox_verbose.html")
    @@ -34794,7 +34578,7 @@ 

    Composition des attributs s
    -
    Out[141]:
    +
    Out[143]:
    @@ -34816,33 +34600,13 @@

    Composition des attributs s
    Army ( - #fail, - #mere + fail, + mere )
    • Avertissement. Table résultant de la conversion forcée d'une association DF.
    • -
    • Le champ fail constitue la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité Busy.
    • -
    • Le champ mere est une clé étrangère. Il a migré directement de l'entité Cast en perdant son caractère identifiant.
    • -
    -
    - -
    -
    Busy ( - fail - ) -
      -
    • Avertissement. Cette table ne comportant qu'un seul champ, on peut envisager de la supprimer.
    • -
    • Le champ fail constitue la clé primaire de la table. C'était déjà un identifiant de l'entité Busy.
    • -
    -
    - -
    -
    Cast ( - mere - ) -
      -
    • Avertissement. Cette table ne comportant qu'un seul champ, on peut envisager de la supprimer.
    • -
    • Le champ mere constitue la clé primaire de la table. C'était déjà un identifiant de l'entité Cast.
    • +
    • Le champ fail constitue la clé primaire de la table. Sa table d'origine (Busy) ayant été supprimée, il n'est pas considéré comme clé étrangère.
    • +
    • Le champ mere a migré directement de l'entité Cast en perdant son caractère identifiant. La table correspondante ayant été supprimée, il n'est pas considéré comme clé étrangère.
    @@ -34859,27 +34623,17 @@

    Composition des attributs s
    Poll ( - #mere, + mere, #clue, #book )
      -
    • Le champ mere constitue la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité Cast.
    • +
    • Le champ mere constitue la clé primaire de la table. Sa table d'origine (Cast) ayant été supprimée, il n'est pas considéré comme clé étrangère.
    • Le champ clue est une clé étrangère issue de l'entité Hour. Il devrait normalement faire partie de l'identifiant de Poll, mais a été rétrogradé explicitement au rang de simple attribut.
    • Le champ book est une clé étrangère issue de l'entité Hour. Il devrait normalement faire partie de l'identifiant de Poll, mais a été rétrogradé explicitement au rang de simple attribut.
    - -
    -
    Riot ( - clue - ) -
      -
    • Avertissement. Cette table ne comportant qu'un seul champ, on peut envisager de la supprimer.
    • -
    • Le champ clue constitue la clé primaire de la table. C'était déjà un identifiant de l'entité Riot.
    • -
    -
    - +


    NB. Les tables Busy, Cast et Riot ont été supprimées car elles étaient réduites à la clé primaire de leur entité d'origine. Pour empêcher cette supression, préfixez d'un « + » le nom de l'entité.

    @@ -34962,7 +34716,6 @@

    Gabarit vide&# }, "column_separator": ", ", "compose_relation": "{this_relation_name} ({columns})", - "transform_single_column_relation": [], "transform_forced_relation": [], "transform_relation": [], "relation_sorting_key": { diff --git a/doc/fr_refman.ipynb b/doc/fr_refman.ipynb index cd046a5c..db1a60dc 100644 --- a/doc/fr_refman.ipynb +++ b/doc/fr_refman.ipynb @@ -2,18 +2,26 @@ "cells": [ { "cell_type": "code", - "execution_count": 3, + "execution_count": 1, "metadata": { "init_cell": true }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Mocodo 3.1.0 loaded.\n" + ] + } + ], "source": [ "%reload_ext mocodo" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 2, "metadata": { "init_cell": true }, @@ -51,7 +59,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -61,7 +69,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,1\n", "\t\n", @@ -73,7 +81,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -89,7 +97,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -109,7 +117,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t0,N\n", "\t\n", @@ -124,7 +132,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,1\n", "\t\n", @@ -139,7 +147,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -153,7 +161,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -167,7 +175,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -181,7 +189,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -195,7 +203,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -208,7 +216,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -255,13 +263,6 @@ " Num. salle\n", " )\n", "

    \n", - "\n", "
    \n", " Faire Cours (\n", " #Num. classe,\n", @@ -269,19 +270,12 @@ " Vol. horaire\n", " )\n", "
    \n", - "\n", "
    \n", " Noter (\n", " #Num. élève,\n", " #Num. prof,\n", - " #Libellé matière,\n", - " #Date,\n", + " Libellé matière,\n", + " Date,\n", " Note\n", " )\n", "
    \n", @@ -290,7 +284,7 @@ " Num. prof,\n", " Nom prof,\n", " #Code catégorie,\n", - " #Libellé matière\n", + " Libellé matière\n", " )\n", "

    \n", "
    \n", @@ -338,7 +332,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -348,12 +342,13 @@ "- Nom catégorie\n", "- Num. classe\n", "- Num. salle\n", - "- Date\n", "- Vol. horaire\n", "- Libellé matière\n", + "- Date\n", "- Note\n", "- Num. prof\n", "- Nom prof\n", + "- Libellé matière\n", "- Num. élève\n", "- Nom élève" ], @@ -361,7 +356,7 @@ "" ] }, - "execution_count": 6, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -379,7 +374,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -389,7 +384,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -403,7 +398,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -419,7 +414,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -433,7 +428,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -448,7 +443,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -468,7 +463,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -584,7 +579,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 6, "metadata": { "scrolled": true }, @@ -593,10 +588,10 @@ "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -1065,17 +1060,17 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -1091,7 +1086,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t0,N\n", "\t\n", @@ -1106,7 +1101,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -1121,7 +1116,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -1136,7 +1131,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -1178,17 +1173,17 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -1204,7 +1199,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t0,N\n", "\t\n", @@ -1219,7 +1214,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -1234,7 +1229,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -1249,7 +1244,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -1298,7 +1293,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -1307,7 +1302,7 @@ "1005" ] }, - "execution_count": 11, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -1383,7 +1378,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -1392,7 +1387,7 @@ "1039" ] }, - "execution_count": 12, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -1495,17 +1490,17 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t0,N\n", "\t\n", @@ -1520,7 +1515,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -1536,7 +1531,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -1552,7 +1547,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -1567,7 +1562,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -1640,17 +1635,17 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t0,N\n", "\t\n", @@ -1662,7 +1657,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -1678,7 +1673,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -1694,7 +1689,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -1709,7 +1704,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -1757,17 +1752,17 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t0,N\n", "\t\n", @@ -1782,7 +1777,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -1830,17 +1825,17 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,1\n", "\t\n", @@ -1857,7 +1852,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -1872,7 +1867,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -1887,7 +1882,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -1952,7 +1947,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 15, "metadata": { "scrolled": true }, @@ -1961,10 +1956,10 @@ "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -2011,17 +2006,17 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -2038,7 +2033,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,1\n", "\t\n", @@ -2054,7 +2049,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t0,N\n", "\t\n", @@ -2071,7 +2066,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -2084,7 +2079,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -2179,17 +2174,17 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t0/N\n", "\t\n", @@ -2204,7 +2199,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1/N\n", "\t\n", @@ -2220,7 +2215,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -2236,7 +2231,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -2251,7 +2246,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -2309,17 +2304,17 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t0,N\n", "\t\n", @@ -2334,7 +2329,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\tl,N\n", "\t\n", @@ -2350,7 +2345,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -2366,7 +2361,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -2381,7 +2376,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -2429,17 +2424,17 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t0,N\n", "\t\n", @@ -2451,7 +2446,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -2467,7 +2462,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -2483,7 +2478,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -2498,7 +2493,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -2561,17 +2556,17 @@ }, { "cell_type": "code", - "execution_count": 144, + "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,1\n", "\t\n", @@ -2586,7 +2581,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -2599,7 +2594,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -2638,17 +2633,17 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -2663,7 +2658,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,1\n", "\t\n", @@ -2678,7 +2673,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t0,N\n", "\t\n", @@ -2695,7 +2690,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t0,N\n", "\t\n", @@ -2710,7 +2705,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t0,N\n", "\t\n", @@ -2728,7 +2723,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t0,N\n", "\t\n", @@ -2745,7 +2740,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -2762,7 +2757,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -2776,7 +2771,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -2791,7 +2786,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -2805,7 +2800,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -2862,7 +2857,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 22, "metadata": { "scrolled": true }, @@ -2871,10 +2866,10 @@ "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t0,N\n", "\t\n", @@ -2892,7 +2887,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,1\n", "\t\n", @@ -2907,7 +2902,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t0,N\n", "\t\n", @@ -2924,7 +2919,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t0,N\n", "\t\n", @@ -2941,7 +2936,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -2956,7 +2951,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t0,N\n", "\t\n", @@ -2971,7 +2966,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -2986,7 +2981,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -2999,7 +2994,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -3013,7 +3008,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -3027,7 +3022,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -3044,7 +3039,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -3106,17 +3101,17 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -3129,7 +3124,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -3144,7 +3139,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -3183,17 +3178,17 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -3205,7 +3200,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -3220,7 +3215,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -3259,7 +3254,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 25, "metadata": { "scrolled": false }, @@ -3297,17 +3292,17 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t0,1\n", "\t\n", @@ -3324,7 +3319,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -3338,7 +3333,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -3391,17 +3386,17 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -3419,7 +3414,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -3432,7 +3427,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -3446,7 +3441,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -3489,17 +3484,17 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -3519,7 +3514,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -3532,7 +3527,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -3546,7 +3541,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -3585,7 +3580,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 29, "metadata": { "scrolled": true }, @@ -3671,7 +3666,7 @@ "" ] }, - "execution_count": 30, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" } @@ -3696,17 +3691,17 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t0,N\n", "\t\n", @@ -3719,7 +3714,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t0,N\n", "\t\n", @@ -3732,7 +3727,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,1\n", "\t\n", @@ -3744,7 +3739,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -3757,7 +3752,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -3769,7 +3764,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -3783,7 +3778,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -3828,17 +3823,17 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t0,N\n", "\t\n", @@ -3856,7 +3851,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -3870,7 +3865,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -3914,17 +3909,17 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t0,N\n", "\t\n", @@ -3944,7 +3939,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -3959,7 +3954,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -3973,7 +3968,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -4013,7 +4008,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 33, "metadata": { "scrolled": false }, @@ -4022,10 +4017,10 @@ "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t0,N\n", "\t\n", @@ -4045,7 +4040,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -4059,7 +4054,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -4073,7 +4068,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -4087,7 +4082,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -4162,17 +4157,17 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t \n", "\t\n", @@ -4187,7 +4182,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -4202,7 +4197,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -4213,7 +4208,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -4293,17 +4288,17 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\n", "\t \n", @@ -4320,7 +4315,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -4335,7 +4330,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -4346,7 +4341,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -4427,17 +4422,17 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t \n", "\t\n", @@ -4452,7 +4447,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -4467,7 +4462,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -4478,7 +4473,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -4582,7 +4577,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 37, "metadata": { "scrolled": false }, @@ -4591,10 +4586,10 @@ "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t0,N\n", "\t\n", @@ -4609,7 +4604,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -4625,7 +4620,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -4641,7 +4636,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -4656,7 +4651,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -4675,23 +4670,23 @@ "\n", "\tfunction show(evt, text) {\n", "\t\tvar pos = (evt.target.getAttribute(\"y\") < 83) ? \"bottom\" : \"top\";\n", - "\t\tvar note = document.getElementById(pos + \"_note_JDTXXH8N\");\n", + "\t\tvar note = document.getElementById(pos + \"_note_mwgc5Tp6\");\n", "\t\tnote.textContent = text;\n", "\t\tnote.setAttributeNS(null, \"visibility\", \"visible\");\n", - "\t\tdocument.getElementById(pos + \"_overlay_JDTXXH8N\").setAttributeNS(null, \"visibility\", \"visible\");\n", + "\t\tdocument.getElementById(pos + \"_overlay_mwgc5Tp6\").setAttributeNS(null, \"visibility\", \"visible\");\n", "\t}\n", "\tfunction hide(evt) {\n", - "\t\tdocument.getElementById(\"top_note_JDTXXH8N\").setAttributeNS(null, \"visibility\", \"hidden\");\n", - "\t\tdocument.getElementById(\"top_overlay_JDTXXH8N\").setAttributeNS(null, \"visibility\", \"hidden\");\n", - "\t\tdocument.getElementById(\"bottom_note_JDTXXH8N\").setAttributeNS(null, \"visibility\", \"hidden\");\n", - "\t\tdocument.getElementById(\"bottom_overlay_JDTXXH8N\").setAttributeNS(null, \"visibility\", \"hidden\");\n", + "\t\tdocument.getElementById(\"top_note_mwgc5Tp6\").setAttributeNS(null, \"visibility\", \"hidden\");\n", + "\t\tdocument.getElementById(\"top_overlay_mwgc5Tp6\").setAttributeNS(null, \"visibility\", \"hidden\");\n", + "\t\tdocument.getElementById(\"bottom_note_mwgc5Tp6\").setAttributeNS(null, \"visibility\", \"hidden\");\n", + "\t\tdocument.getElementById(\"bottom_overlay_mwgc5Tp6\").setAttributeNS(null, \"visibility\", \"hidden\");\n", "\t}\n", "\n", "\n", - "\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", "" ], "text/plain": [ @@ -4761,7 +4756,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 38, "metadata": {}, "outputs": [ { @@ -4771,7 +4766,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,1\n", "\t\n", @@ -4783,7 +4778,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -4799,7 +4794,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -4819,7 +4814,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t0,N\n", "\t\n", @@ -4834,7 +4829,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,1\n", "\t\n", @@ -4849,7 +4844,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -4863,7 +4858,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -4877,7 +4872,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -4891,7 +4886,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -4905,7 +4900,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -4918,7 +4913,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -4931,21 +4926,21 @@ "\n", "\n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", "" ], "text/plain": [ @@ -12136,17 +12089,17 @@ }, { "cell_type": "code", - "execution_count": 86, + "execution_count": 85, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t0,1\n", "\t\n", @@ -12163,7 +12116,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -12177,7 +12130,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -12209,7 +12162,7 @@ }, { "cell_type": "code", - "execution_count": 87, + "execution_count": 86, "metadata": {}, "outputs": [ { @@ -12275,7 +12228,7 @@ "" ] }, - "execution_count": 87, + "execution_count": 86, "metadata": {}, "output_type": "execute_result" } @@ -12293,17 +12246,17 @@ }, { "cell_type": "code", - "execution_count": 88, + "execution_count": 87, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,1\n", "\t\n", @@ -12320,7 +12273,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -12334,7 +12287,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -12366,7 +12319,7 @@ }, { "cell_type": "code", - "execution_count": 89, + "execution_count": 88, "metadata": {}, "outputs": [ { @@ -12432,7 +12385,7 @@ "" ] }, - "execution_count": 89, + "execution_count": 88, "metadata": {}, "output_type": "execute_result" } @@ -12450,7 +12403,7 @@ }, { "cell_type": "code", - "execution_count": 90, + "execution_count": 89, "metadata": { "scrolled": true }, @@ -12459,10 +12412,10 @@ "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -12479,7 +12432,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -12493,7 +12446,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -12525,7 +12478,7 @@ }, { "cell_type": "code", - "execution_count": 91, + "execution_count": 90, "metadata": {}, "outputs": [ { @@ -12590,7 +12543,7 @@ "" ] }, - "execution_count": 91, + "execution_count": 90, "metadata": {}, "output_type": "execute_result" } @@ -12622,17 +12575,17 @@ }, { "cell_type": "code", - "execution_count": 92, + "execution_count": 91, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -12652,7 +12605,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -12665,7 +12618,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -12679,7 +12632,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -12720,25 +12673,11 @@ " Prix\n", " )\n", "
    \n", - "\n", - "\n", "
    \n", " Réserver (\n", " #Numéro,\n", - " #Date,\n", - " #Nom,\n", + " Date,\n", + " Nom,\n", " Durée\n", " )\n", "
    \n", @@ -12772,17 +12711,17 @@ }, { "cell_type": "code", - "execution_count": 93, + "execution_count": 92, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t0,N\n", "\t\n", @@ -12800,7 +12739,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -12814,7 +12753,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -12914,17 +12853,17 @@ }, { "cell_type": "code", - "execution_count": 94, + "execution_count": 93, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t \n", "\t\n", @@ -12939,7 +12878,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -12954,7 +12893,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -12965,7 +12904,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -13044,17 +12983,17 @@ }, { "cell_type": "code", - "execution_count": 95, + "execution_count": 94, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t \n", "\t\n", @@ -13071,7 +13010,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -13086,7 +13025,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -13097,7 +13036,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -13174,17 +13113,17 @@ }, { "cell_type": "code", - "execution_count": 96, + "execution_count": 95, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t \n", "\t\n", @@ -13200,7 +13139,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -13215,7 +13154,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -13226,7 +13165,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -13266,13 +13205,11 @@ " nom de jeune fille\n", " )\n", "
    \n", - "\n", "
    \n", " Personne (\n", " num SS,\n", @@ -13317,17 +13254,17 @@ }, { "cell_type": "code", - "execution_count": 97, + "execution_count": 96, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\n", "\t \n", @@ -13344,7 +13281,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -13359,7 +13296,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -13370,7 +13307,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -13453,7 +13390,7 @@ }, { "cell_type": "code", - "execution_count": 98, + "execution_count": 97, "metadata": {}, "outputs": [ { @@ -13501,17 +13438,17 @@ }, { "cell_type": "code", - "execution_count": 99, + "execution_count": 98, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -13526,7 +13463,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,1\n", "\t\n", @@ -13541,7 +13478,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,1\n", "\t\n", @@ -13556,7 +13493,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t \n", "\t\n", @@ -13573,7 +13510,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -13588,7 +13525,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -13603,7 +13540,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -13618,7 +13555,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -13632,7 +13569,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -13645,7 +13582,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -13659,7 +13596,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -13673,7 +13610,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -13687,7 +13624,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -13700,7 +13637,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -13714,7 +13651,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -13728,7 +13665,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -13741,7 +13678,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -13792,7 +13729,7 @@ }, { "cell_type": "code", - "execution_count": 100, + "execution_count": 99, "metadata": { "scrolled": true }, @@ -13890,63 +13827,24 @@ " #magna\n", " )\n", "
      \n", - "
    • Le champ orci constitue la clé primaire de la table. C'était déjà un identifiant de l'entité SUSCIPIT.
    • \n", - "
    • Le champ lorem était déjà un simple attribut de l'entité SUSCIPIT.
    • \n", - "
    • Le champ magna est une clé étrangère. Il a migré par l'association de dépendance fonctionnelle RHONCUS à partir de l'entité TRISTIS en perdant son caractère identifiant.
    • \n", - "
    \n", - "
    \n", - "\n", - "
    \n", - "
    TRISTIS (\n", - " magna,\n", - " vestibulum,\n", - " #fermentum,\n", - " type,\n", - " convallis,\n", - " ipsum,\n", - " pulvinar,\n", - " audis,\n", - " #gravida,\n", - " tempor,\n", - " fugit\n", - " )\n", - "
      \n", - "
    • Le champ magna constitue la clé primaire de la table. C'était déjà un identifiant de l'entité TRISTIS.
    • \n", - "
    • Le champ vestibulum était déjà un simple attribut de l'entité TRISTIS.
    • \n", - "
    • Le champ fermentum est une clé étrangère. Il a migré par l'association de dépendance fonctionnelle ELIT à partir de l'entité CONSEQUAT en perdant son caractère identifiant.
    • \n", - "
    • Un champ entier type est ajouté pour indiquer la nature de la spécialisation : 1 pour la première entité-fille, 2 pour la deuxième, etc. Jamais vide, du fait de la contrainte de totalité.
    • \n", - "
    • Le champ convallis a migré à partir de l'entité-fille SODALES (supprimée).
    • \n", - "
    • Le champ ipsum a migré à partir de l'entité-fille SODALES (supprimée).
    • \n", - "
    • Le champ pulvinar a migré à partir de l'entité-fille NEC (supprimée).
    • \n", - "
    • Le champ audis a migré à partir de l'entité-fille NEC (supprimée).
    • \n", - "
    • Le champ gravida est une clé étrangère. Il a migré à partir de l'entité-fille NEC (supprimée) dans laquelle il avait déjà migré à partir de l'entité CURABITUR.
    • \n", - "
    • Le champ tempor a migré à partir de l'entité-fille LACUS (supprimée).
    • \n", - "
    • Le champ fugit a migré à partir de l'entité-fille LACUS (supprimée).
    • \n", - "
    \n", - "
    \n", - "\n", - "
    \n", - "
    ULTRICES (\n", - " #posuere,\n", - " #magna\n", - " )\n", - "
      \n", - "
    • Le champ posuere fait partie de la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité LIBERO.
    • \n", - "
    • Le champ magna fait partie de la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité TRISTIS.
    • \n", - "
    \n", - "
    \n", - "\n", - "
    \n", - "\n", - "" + "
  • Le champ orci constitue la " ], "text/plain": [ "" ] }, - "execution_count": 100, + "execution_count": 99, "metadata": {}, "output_type": "execute_result" + }, + { + "data": { + "text/html": [ + "limit_output extension: Maximum message size of 4000 exceeded with 7452 characters" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ @@ -13955,7 +13853,7 @@ }, { "cell_type": "code", - "execution_count": 101, + "execution_count": 100, "metadata": { "scrolled": false }, @@ -13964,10 +13862,10 @@ "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -13982,7 +13880,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -13997,7 +13895,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -14011,7 +13909,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -14034,7 +13932,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -14048,7 +13946,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -14062,7 +13960,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -14077,7 +13975,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -14092,7 +13990,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -14174,17 +14072,17 @@ }, { "cell_type": "code", - "execution_count": 102, + "execution_count": 101, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -14199,7 +14097,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,1\n", "\t\n", @@ -14214,7 +14112,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,1\n", "\t\n", @@ -14229,7 +14127,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t \n", "\t\n", @@ -14248,7 +14146,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -14263,7 +14161,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -14278,7 +14176,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -14293,7 +14191,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -14307,7 +14205,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -14320,7 +14218,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -14334,7 +14232,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -14348,7 +14246,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -14362,7 +14260,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -14375,7 +14273,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -14389,7 +14287,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -14403,7 +14301,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -14416,7 +14314,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -14467,7 +14365,7 @@ }, { "cell_type": "code", - "execution_count": 103, + "execution_count": 102, "metadata": { "scrolled": true }, @@ -14565,87 +14463,24 @@ " #gravida\n", " )\n", "
      \n", - "
    • Le champ magna constitue la clé primaire de la table. C'est une clé étrangère qui a migré à partir de l'entité-mère TRISTIS.
    • \n", - "
    • Les champs pulvinar et audis étaient déjà de simples attributs de l'entité NEC.
    • \n", - "
    • Le champ gravida est une clé étrangère. Il a migré par l'association de dépendance fonctionnelle MOLLIS à partir de l'entité CURABITUR en perdant son caractère identifiant.
    • \n", - "
    \n", - "
  • \n", - "\n", - "
    \n", - "
    QUAM (\n", - " cras,\n", - " sed,\n", - " #magna\n", - " )\n", - "
      \n", - "
    • Le champ cras constitue la clé primaire de la table. C'était déjà un identifiant de l'entité QUAM.
    • \n", - "
    • Le champ sed était déjà un simple attribut de l'entité QUAM.
    • \n", - "
    • Le champ magna est une clé étrangère. Il a migré par l'association de dépendance fonctionnelle VITAE à partir de l'entité SODALES en perdant son caractère identifiant.
    • \n", - "
    \n", - "
    \n", - "\n", - "
    \n", - "
    SODALES (\n", - " #magna,\n", - " convallis,\n", - " ipsum\n", - " )\n", - "
      \n", - "
    • Le champ magna constitue la clé primaire de la table. C'est une clé étrangère qui a migré à partir de l'entité-mère TRISTIS.
    • \n", - "
    • Les champs convallis et ipsum étaient déjà de simples attributs de l'entité SODALES.
    • \n", - "
    \n", - "
    \n", - "\n", - "
    \n", - "
    SUSCIPIT (\n", - " orci,\n", - " lorem,\n", - " #magna\n", - " )\n", - "
      \n", - "
    • Le champ orci constitue la clé primaire de la table. C'était déjà un identifiant de l'entité SUSCIPIT.
    • \n", - "
    • Le champ lorem était déjà un simple attribut de l'entité SUSCIPIT.
    • \n", - "
    • Le champ magna est une clé étrangère. Il a migré par l'association de dépendance fonctionnelle RHONCUS à partir de l'entité TRISTIS en perdant son caractère identifiant.
    • \n", - "
    \n", - "
    \n", - "\n", - "
    \n", - "
    TRISTIS (\n", - " magna,\n", - " vestibulum,\n", - " #fermentum,\n", - " type\n", - " )\n", - "
      \n", - "
    • Le champ magna constitue la clé primaire de la table. C'était déjà un identifiant de l'entité TRISTIS.
    • \n", - "
    • Le champ vestibulum était déjà un simple attribut de l'entité TRISTIS.
    • \n", - "
    • Le champ fermentum est une clé étrangère. Il a migré par l'association de dépendance fonctionnelle ELIT à partir de l'entité CONSEQUAT en perdant son caractère identifiant.
    • \n", - "
    • Un champ entier type est ajouté pour indiquer la nature de la spécialisation : 1 pour la première entité-fille, 2 pour la deuxième, etc. Jamais vide, du fait de la contrainte de totalité.
    • \n", - "
    \n", - "
    \n", - "\n", - "
    \n", - "
    ULTRICES (\n", - " #posuere,\n", - " #magna\n", - " )\n", - "
      \n", - "
    • Le champ posuere fait partie de la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité LIBERO.
    • \n", - "
    • Le champ magna fait partie de la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité LACUS.
    • \n", - "
    \n", - "
    \n", - "\n", - "
    \n", - "\n", - "" + "
  • Le champ magna constitue la clé primaire de la table. C'est " ], "text/plain": [ "" ] }, - "execution_count": 103, + "execution_count": 102, "metadata": {}, "output_type": "execute_result" + }, + { + "data": { + "text/html": [ + "limit_output extension: Maximum message size of 4000 exceeded with 8212 characters" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ @@ -14654,7 +14489,7 @@ }, { "cell_type": "code", - "execution_count": 104, + "execution_count": 103, "metadata": { "scrolled": false }, @@ -14663,10 +14498,10 @@ "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -14681,7 +14516,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -14696,7 +14531,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -14711,7 +14546,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -14725,7 +14560,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -14741,7 +14576,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -14757,7 +14592,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -14771,7 +14606,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -14785,7 +14620,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -14800,7 +14635,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -14815,7 +14650,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -14830,7 +14665,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -14927,17 +14762,17 @@ }, { "cell_type": "code", - "execution_count": 105, + "execution_count": 104, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -14952,7 +14787,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,1\n", "\t\n", @@ -14967,7 +14802,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,1\n", "\t\n", @@ -14982,7 +14817,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\n", "\t \n", @@ -15002,7 +14837,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -15017,7 +14852,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -15032,7 +14867,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -15047,7 +14882,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -15061,7 +14896,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -15074,7 +14909,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -15088,7 +14923,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -15102,7 +14937,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -15116,7 +14951,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -15129,7 +14964,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -15143,7 +14978,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -15157,7 +14992,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -15170,7 +15005,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -15221,7 +15056,7 @@ }, { "cell_type": "code", - "execution_count": 106, + "execution_count": 105, "metadata": { "scrolled": true }, @@ -15307,100 +15142,24 @@ "
  • \n", "\n", "
    \n", - "
    LIBERO (\n", - " posuere,\n", - " lacrima\n", - " )\n", - "
      \n", - "
    • Le champ posuere constitue la clé primaire de la table. C'était déjà un identifiant de l'entité LIBERO.
    • \n", - "
    • Le champ lacrima était déjà un simple attribut de l'entité LIBERO.
    • \n", - "
    \n", - "
    \n", - "\n", - "
    \n", - "
    NEC (\n", - " magna,\n", - " vestibulum,\n", - " #fermentum,\n", - " pulvinar,\n", - " audis,\n", - " #gravida\n", - " )\n", - "
      \n", - "
    • Le champ magna constitue la clé primaire de la table. Il était clé primaire de l'entité-mère TRISTIS (supprimée).
    • \n", - "
    • Le champ vestibulum est un simple attribut. Il était simple attribut de l'entité-mère TRISTIS (supprimée).
    • \n", - "
    • Le champ fermentum est une clé étrangère. Il a migré à travers l'entité-mère TRISTIS (supprimée), et réfère maintenant directement à l'entité CONSEQUAT.
    • \n", - "
    • Les champs pulvinar et audis étaient déjà de simples attributs de l'entité NEC.
    • \n", - "
    • Le champ gravida est une clé étrangère. Il a migré par l'association de dépendance fonctionnelle MOLLIS à partir de l'entité CURABITUR en perdant son caractère identifiant.
    • \n", - "
    \n", - "
    \n", - "\n", - "
    \n", - "
    QUAM (\n", - " cras,\n", - " sed,\n", - " #magna\n", - " )\n", - "
      \n", - "
    • Le champ cras constitue la clé primaire de la table. C'était déjà un identifiant de l'entité QUAM.
    • \n", - "
    • Le champ sed était déjà un simple attribut de l'entité QUAM.
    • \n", - "
    • Le champ magna est une clé étrangère. Il a migré par l'association de dépendance fonctionnelle VITAE à partir de l'entité SODALES en perdant son caractère identifiant.
    • \n", - "
    \n", - "
    \n", - "\n", - "
    \n", - "
    SODALES (\n", - " magna,\n", - " vestibulum,\n", - " #fermentum,\n", - " convallis,\n", - " ipsum\n", - " )\n", - "
      \n", - "
    • Le champ magna constitue la clé primaire de la table. Il était clé primaire de l'entité-mère TRISTIS (supprimée).
    • \n", - "
    • Le champ vestibulum est un simple attribut. Il était simple attribut de l'entité-mère TRISTIS (supprimée).
    • \n", - "
    • Le champ fermentum est une clé étrangère. Il a migré à travers l'entité-mère TRISTIS (supprimée), et réfère maintenant directement à l'entité CONSEQUAT.
    • \n", - "
    • Les champs convallis et ipsum étaient déjà de simples attributs de l'entité SODALES.
    • \n", - "
    \n", - "
    \n", - "\n", - "
    \n", - "
    SUSCIPIT (\n", - " orci,\n", - " lorem,\n", - " magna,\n", - " type\n", - " )\n", - "
      \n", - "
    • Le champ orci constitue la clé primaire de la table. C'était déjà un identifiant de l'entité SUSCIPIT.
    • \n", - "
    • Le champ lorem était déjà un simple attribut de l'entité SUSCIPIT.
    • \n", - "
    • Le champ magna a migré par l'association de dépendance fonctionnelle RHONCUS à partir de l'entité TRISTIS (supprimée). Attention : aucune contrainte d'intégrité référentielle n'est plus assurée.
    • \n", - "
    • Un champ entier type est ajouté pour indiquer la nature de la spécialisation : 1 pour la première entité-fille, 2 pour la deuxième, etc. Jamais vide, du fait de la contrainte de totalité.
    • \n", - "
    \n", - "
    \n", - "\n", - "
    \n", - "
    ULTRICES (\n", - " #posuere,\n", - " #magna\n", - " )\n", - "
      \n", - "
    • Le champ posuere fait partie de la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité LIBERO.
    • \n", - "
    • Le champ magna fait partie de la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité LACUS.
    • \n", - "
    \n", - "
    \n", - "\n", - "
    \n", - "\n", - "" + "
    1,N\n", "\t\n", @@ -15691,7 +15450,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t \n", "\t\n", @@ -15708,7 +15467,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,1\n", "\t\n", @@ -15723,7 +15482,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -15738,7 +15497,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -15751,7 +15510,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -15764,7 +15523,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -15778,7 +15537,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -15795,23 +15554,23 @@ "\n", "\n", - "\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", "" ], "text/plain": [ @@ -15842,7 +15601,7 @@ }, { "cell_type": "code", - "execution_count": 109, + "execution_count": 108, "metadata": {}, "outputs": [ { @@ -15910,7 +15669,7 @@ "" ] }, - "execution_count": 109, + "execution_count": 108, "metadata": {}, "output_type": "execute_result" } @@ -15921,7 +15680,7 @@ }, { "cell_type": "code", - "execution_count": 110, + "execution_count": 109, "metadata": { "scrolled": false }, @@ -15930,10 +15689,10 @@ "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -15956,7 +15715,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -16005,17 +15764,17 @@ }, { "cell_type": "code", - "execution_count": 111, + "execution_count": 110, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -16030,7 +15789,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t \n", "\t\n", @@ -16049,7 +15808,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,1\n", "\t\n", @@ -16064,7 +15823,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -16079,7 +15838,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -16092,7 +15851,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -16105,7 +15864,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -16119,7 +15878,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -16136,23 +15895,23 @@ "\n", "\tfunction show(evt, text) {\n", "\t\tvar pos = (evt.target.getAttribute(\"y\") < 249) ? \"bottom\" : \"top\";\n", - "\t\tvar note = document.getElementById(pos + \"_note_0Kb11Hzu\");\n", + "\t\tvar note = document.getElementById(pos + \"_note_OhEl4JJP\");\n", "\t\tnote.textContent = text;\n", "\t\tnote.setAttributeNS(null, \"visibility\", \"visible\");\n", - "\t\tdocument.getElementById(pos + \"_overlay_0Kb11Hzu\").setAttributeNS(null, \"visibility\", \"visible\");\n", + "\t\tdocument.getElementById(pos + \"_overlay_OhEl4JJP\").setAttributeNS(null, \"visibility\", \"visible\");\n", "\t}\n", "\tfunction hide(evt) {\n", - "\t\tdocument.getElementById(\"top_note_0Kb11Hzu\").setAttributeNS(null, \"visibility\", \"hidden\");\n", - "\t\tdocument.getElementById(\"top_overlay_0Kb11Hzu\").setAttributeNS(null, \"visibility\", \"hidden\");\n", - "\t\tdocument.getElementById(\"bottom_note_0Kb11Hzu\").setAttributeNS(null, \"visibility\", \"hidden\");\n", - "\t\tdocument.getElementById(\"bottom_overlay_0Kb11Hzu\").setAttributeNS(null, \"visibility\", \"hidden\");\n", + "\t\tdocument.getElementById(\"top_note_OhEl4JJP\").setAttributeNS(null, \"visibility\", \"hidden\");\n", + "\t\tdocument.getElementById(\"top_overlay_OhEl4JJP\").setAttributeNS(null, \"visibility\", \"hidden\");\n", + "\t\tdocument.getElementById(\"bottom_note_OhEl4JJP\").setAttributeNS(null, \"visibility\", \"hidden\");\n", + "\t\tdocument.getElementById(\"bottom_overlay_OhEl4JJP\").setAttributeNS(null, \"visibility\", \"hidden\");\n", "\t}\n", "\n", "\n", - "\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", "" ], "text/plain": [ @@ -16183,7 +15942,7 @@ }, { "cell_type": "code", - "execution_count": 112, + "execution_count": 111, "metadata": {}, "outputs": [ { @@ -16263,22 +16022,24 @@ " #magna lacus\n", " )\n", "
      \n", - "
    • Le champ magna sodales fait partie de la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité SODALES.
    • \n", - "
    • Le champ magna lacus fait partie de la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité LACUS.
    • \n", - "
    \n", - "
    \n", - "\n", - "
    \n", - "\n", - "" + "
  • Le champ magna sodales fait partie de la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité SODALES<" ], "text/plain": [ "" ] }, - "execution_count": 112, + "execution_count": 111, "metadata": {}, "output_type": "execute_result" + }, + { + "data": { + "text/html": [ + "limit_output extension: Maximum message size of 4000 exceeded with 4226 characters" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ @@ -16287,7 +16048,7 @@ }, { "cell_type": "code", - "execution_count": 113, + "execution_count": 112, "metadata": { "scrolled": false }, @@ -16296,10 +16057,10 @@ "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -16316,7 +16077,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -16331,7 +16092,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -16346,7 +16107,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -16361,7 +16122,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -16425,17 +16186,17 @@ }, { "cell_type": "code", - "execution_count": 114, + "execution_count": 113, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -16450,7 +16211,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\n", "\t \n", @@ -16470,7 +16231,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,1\n", "\t\n", @@ -16485,7 +16246,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -16500,7 +16261,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -16513,7 +16274,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -16526,7 +16287,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -16540,7 +16301,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -16557,23 +16318,23 @@ "\n", "\tfunction show(evt, text) {\n", "\t\tvar pos = (evt.target.getAttribute(\"y\") < 249) ? \"bottom\" : \"top\";\n", - "\t\tvar note = document.getElementById(pos + \"_note_MQ5DcvTz\");\n", + "\t\tvar note = document.getElementById(pos + \"_note_ybFEaF5G\");\n", "\t\tnote.textContent = text;\n", "\t\tnote.setAttributeNS(null, \"visibility\", \"visible\");\n", - "\t\tdocument.getElementById(pos + \"_overlay_MQ5DcvTz\").setAttributeNS(null, \"visibility\", \"visible\");\n", + "\t\tdocument.getElementById(pos + \"_overlay_ybFEaF5G\").setAttributeNS(null, \"visibility\", \"visible\");\n", "\t}\n", "\tfunction hide(evt) {\n", - "\t\tdocument.getElementById(\"top_note_MQ5DcvTz\").setAttributeNS(null, \"visibility\", \"hidden\");\n", - "\t\tdocument.getElementById(\"top_overlay_MQ5DcvTz\").setAttributeNS(null, \"visibility\", \"hidden\");\n", - "\t\tdocument.getElementById(\"bottom_note_MQ5DcvTz\").setAttributeNS(null, \"visibility\", \"hidden\");\n", - "\t\tdocument.getElementById(\"bottom_overlay_MQ5DcvTz\").setAttributeNS(null, \"visibility\", \"hidden\");\n", + "\t\tdocument.getElementById(\"top_note_ybFEaF5G\").setAttributeNS(null, \"visibility\", \"hidden\");\n", + "\t\tdocument.getElementById(\"top_overlay_ybFEaF5G\").setAttributeNS(null, \"visibility\", \"hidden\");\n", + "\t\tdocument.getElementById(\"bottom_note_ybFEaF5G\").setAttributeNS(null, \"visibility\", \"hidden\");\n", + "\t\tdocument.getElementById(\"bottom_overlay_ybFEaF5G\").setAttributeNS(null, \"visibility\", \"hidden\");\n", "\t}\n", "\n", "\n", - "\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", "" ], "text/plain": [ @@ -16604,7 +16365,7 @@ }, { "cell_type": "code", - "execution_count": 115, + "execution_count": 114, "metadata": {}, "outputs": [ { @@ -16678,21 +16439,24 @@ " )\n", "
      \n", "
    • Le champ magna sodales fait partie de la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité SODALES.
    • \n", - "
    • Le champ magna lacus fait partie de la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité LACUS.
    • \n", - "
    \n", - "
  • \n", - "\n", - "
    \n", - "\n", - "" + "
  • Le champ magna lacus fait partie de la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'enti" ], "text/plain": [ "" ] }, - "execution_count": 115, + "execution_count": 114, "metadata": {}, "output_type": "execute_result" + }, + { + "data": { + "text/html": [ + "limit_output extension: Maximum message size of 4000 exceeded with 4070 characters" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ @@ -16701,7 +16465,7 @@ }, { "cell_type": "code", - "execution_count": 116, + "execution_count": 115, "metadata": { "scrolled": false }, @@ -16710,10 +16474,10 @@ "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -16731,7 +16495,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -16747,7 +16511,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -16762,7 +16526,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -16810,6 +16574,482 @@ "%mocodo --input mocodo_notebook/sandbox.mld" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Suppression des tables indépendantes réduites à leur clé primaire" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Nouveauté de la version 3.1.** À partir de la version 2.3.5, les tables réduites à une clé primaire non composite étaient supprimées. Dans le diagramme relationnel, les éventuelles clés étrangères correspondantes perdaient leur caractère étranger. Ainsi, dans le diagramme relationnel de l'[introduction](#Introduction), les tables MATIÈRE et DATE disparaissaient et les clés étrangères _libellé matière_ et _date_ n'étaient pas préfixées d'un dièse ou accompagnées d'une flèche.\n", + "\n", + "Ce mécanisme est maintenant étendu :\n", + "- aux tables réduites à leur clé primaire, même composite, pourvu qu'aucun de ses composants ne soit clé étrangère ;\n", + "- à tous les formats de sortie : précédemment, la suppression de ces tables n'était effective que dans le diagramme relationnel ; dans les autres formats, elles étaient juste passées en commentaire, tandis que leur clé primaire, lorsqu'elle migrait dans une autre table, n'en était pas moins préfixée d'un dièse.\n", + "\n", + "Ainsi, dans le MLD ci-dessous :\n", + "- la table DATE est supprimée (auparavant, elle était simplement masquée) ;\n", + "- la table POSITION est également supprimée (auparavant, elle était conservée) ;\n", + "- les clés des tables supprimées (_Date_, _Latitude_, _Longitude_) ne sont plus marquées comme étrangères dans ÉLÈVE ou ÉVALUER ;\n", + "- la table ENSEIGNER est toujours conservée : quoique réduite à sa clé primaire, les composants de celle-ci sont des clés étrangères." + ] + }, + { + "cell_type": "code", + "execution_count": 116, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t1,N\n", + "\t\n", + "\t1,N\n", + "\t\n", + "\t\t\n", + "\t\t\n", + "\t\t\n", + "\t\t\n", + "\t\tEnseigner\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t1,N\n", + "\t\n", + "\t0,N\n", + "\t\n", + "\t0,N\n", + "\t\n", + "\t1,N\n", + "\t\n", + "\t\t\n", + "\t\t\n", + "\t\t\n", + "\t\t\n", + "\t\tÉvaluer\n", + "\t\tNote\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t1,1\n", + "\t\n", + "\t0,N\n", + "\t\n", + "\t\t\n", + "\t\tDF\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\t\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\tProf\n", + "\tNum. prof\n", + "\t\n", + "\tNom prof\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\t\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\tÉlève\n", + "\tNum. élève\n", + "\t\n", + "\tNom élève\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\t\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\tPosition\n", + "\tLatitude\n", + "\t\n", + "\tLongitude\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\t\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\tDate\n", + "\tDate\n", + "\t\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
    \n", + "
    \n", + " Enseigner (\n", + " #Num. prof,\n", + " #Num. élève\n", + " )\n", + "
    \n", + "
    \n", + " Prof (\n", + " Num. prof,\n", + " Nom prof\n", + " )\n", + "
    \n", + "
    \n", + " Élève (\n", + " Num. élève,\n", + " Nom élève,\n", + " Date\n", + " )\n", + "
    \n", + "
    \n", + " Évaluer (\n", + " #Num. élève,\n", + " #Num. prof,\n", + " Latitude,\n", + " Longitude,\n", + " Date,\n", + " Note\n", + " )\n", + "
    \n", + "
    \n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%mocodo --mld --relations markdown_verbose\n", + "Prof: Num. prof, Nom prof\n", + "Enseigner, 1N Prof, 1N Élève\n", + "Élève: Num. élève, Nom élève\n", + "\n", + "Position: Latitude, _Longitude\n", + "Évaluer, 1N Élève, 0N Prof, 0N Position, 1N Date: Note\n", + "Date: Date\n", + "DF, 11 Élève, 0N Date" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Les sorties « verbeuses » en HTML et Markdown expliquent le traitement des champs concernés (ci-dessous, ÉLÈVE / Date, ÉVALUER / Latitutde, Longitude et Date) et ajoutent une note de fin justifiant les suppressions (ci-dessous, NB)." + ] + }, + { + "cell_type": "code", + "execution_count": 117, + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "**Enseigner** (_#Num. prof_, _#Num. élève_) \n", + "- Le champ _Num. prof_ fait partie de la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité _Prof_. \n", + "- Le champ _Num. élève_ fait partie de la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité _Élève_. \n", + "\n", + "**Prof** (Num. prof, Nom prof) \n", + "- Le champ _Num. prof_ constitue la clé primaire de la table. C'était déjà un identifiant de l'entité _Prof_. \n", + "- Le champ _Nom prof_ était déjà un simple attribut de l'entité _Prof_. \n", + "\n", + "**Élève** (Num. élève, Nom élève, _#Date_) \n", + "- Le champ _Num. élève_ constitue la clé primaire de la table. C'était déjà un identifiant de l'entité _Élève_. \n", + "- Le champ _Nom élève_ était déjà un simple attribut de l'entité _Élève_. \n", + "- Le champ _Date_ a migré par l'association de dépendance fonctionnelle _DF_ à partir de l'entité _Date_ en perdant son caractère identifiant. De plus, comme la table créée à partir de cette entité a été supprimée, il n'est pas considéré comme clé étrangère. \n", + "\n", + "**Évaluer** (_#Num. élève_, _#Num. prof_, _#Latitude_, _#Longitude_, _#Date_, Note) \n", + "- Le champ _Num. élève_ fait partie de la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité _Élève_. \n", + "- Le champ _Num. prof_ fait partie de la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité _Prof_. \n", + "- Les champs _Latitude_ et _Longitude_ font partie de la clé primaire de la table. Leur table d'origine (_Position_) ayant été supprimée, ils ne sont pas considérés comme clés étrangères. \n", + "- Le champ _Date_ fait partie de la clé primaire de la table. Sa table d'origine (_Date_) ayant été supprimée, il n'est pas considéré comme clé étrangère. \n", + "- Le champ _Note_ était déjà un simple attribut de l'association _Évaluer_. \n", + "\n", + "---\n", + "\n", + "**NB.** Les tables _Date_ et _Position_ ont été supprimées car elles étaient réduites à la clé primaire de leur entité d'origine. Pour empêcher cette supression, préfixez d'un « + » le nom de l'entité." + ], + "text/plain": [ + "" + ] + }, + "execution_count": 117, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "display.Markdown(\"mocodo_notebook/sandbox_verbose.md\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Ce mécanisme est également devenu débrayable. Si l'on souhaite conserver une table indépendante réduite à sa clé primaire, on préfixe du signe « + » l'entité correspondante (ci-dessous, POSITION). Pour les tables non supprimables, ce préfixe est simplement ignoré (ci-dessous, PROF)." + ] + }, + { + "cell_type": "code", + "execution_count": 118, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t1,N\n", + "\t\n", + "\t1,N\n", + "\t\n", + "\t\t\n", + "\t\t\n", + "\t\t\n", + "\t\t\n", + "\t\tEnseigner\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t1,N\n", + "\t\n", + "\t0,N\n", + "\t\n", + "\t0,N\n", + "\t\n", + "\t1,N\n", + "\t\n", + "\t\t\n", + "\t\t\n", + "\t\t\n", + "\t\t\n", + "\t\tÉvaluer\n", + "\t\tNote\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t1,1\n", + "\t\n", + "\t0,N\n", + "\t\n", + "\t\t\n", + "\t\tDF\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\t\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\tProf\n", + "\tNum. prof\n", + "\t\n", + "\tNom prof\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\t\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\tÉlève\n", + "\tNum. élève\n", + "\t\n", + "\tNom élève\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\t\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\tPosition\n", + "\tLatitude\n", + "\t\n", + "\tLongitude\n", + "\t\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\t\n", + "\t\t\n", + "\t\t\n", + "\t\n", + "\tDate\n", + "\tDate\n", + "\t\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
    \n", + "
    \n", + " Enseigner (\n", + " #Num. prof,\n", + " #Num. élève\n", + " )\n", + "
    \n", + "
    \n", + " Position (\n", + " Latitude,\n", + " Longitude\n", + " )\n", + "
    \n", + "
    \n", + " Prof (\n", + " Num. prof,\n", + " Nom prof\n", + " )\n", + "
    \n", + "
    \n", + " Élève (\n", + " Num. élève,\n", + " Nom élève,\n", + " Date\n", + " )\n", + "
    \n", + "
    \n", + " Évaluer (\n", + " #Num. élève,\n", + " #Num. prof,\n", + " #Latitude,\n", + " #Longitude,\n", + " Date,\n", + " Note\n", + " )\n", + "
    \n", + "
    \n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%mocodo --mld\n", + "+Prof: Num. prof, Nom prof\n", + "Enseigner, 1N Prof, 1N Élève\n", + "Élève: Num. élève, Nom élève\n", + "\n", + "+Position: Latitude, _Longitude\n", + "Évaluer, 1N Élève, 0N Prof, 0N Position, 1N Date: Note\n", + "Date: Date\n", + "DF, 11 Élève, 0N Date" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Pour une discussion sur cette problématique, cf. [issue #66](https://github.com/laowantong/mocodo/issues/66)." + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -16851,17 +17091,17 @@ }, { "cell_type": "code", - "execution_count": 117, + "execution_count": 119, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t0,N\n", "\t\n", @@ -16873,7 +17113,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -16889,7 +17129,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -16905,7 +17145,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -16920,7 +17160,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -16954,7 +17194,7 @@ }, { "cell_type": "code", - "execution_count": 118, + "execution_count": 120, "metadata": {}, "outputs": [ { @@ -17019,40 +17259,7 @@ ".output_html .sc { color: #BA2121 } /* Literal.String.Char */\n", ".output_html .dl { color: #BA2121 } /* Literal.String.Delimiter */\n", ".output_html .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */\n", - ".output_html .s2 { color: #BA2121 } /* Literal.String.Double */\n", - ".output_html .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */\n", - ".output_html .sh { color: #BA2121 } /* Literal.String.Heredoc */\n", - ".output_html .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */\n", - ".output_html .sx { color: #008000 } /* Literal.String.Other */\n", - ".output_html .sr { color: #A45A77 } /* Literal.String.Regex */\n", - ".output_html .s1 { color: #BA2121 } /* Literal.String.Single */\n", - ".output_html .ss { color: #19177C } /* Literal.String.Symbol */\n", - ".output_html .bp { color: #008000 } /* Name.Builtin.Pseudo */\n", - ".output_html .fm { color: #0000FF } /* Name.Function.Magic */\n", - ".output_html .vc { color: #19177C } /* Name.Variable.Class */\n", - ".output_html .vg { color: #19177C } /* Name.Variable.Global */\n", - ".output_html .vi { color: #19177C } /* Name.Variable.Instance */\n", - ".output_html .vm { color: #19177C } /* Name.Variable.Magic */\n", - ".output_html .il { color: #666666 } /* Literal.Number.Integer.Long */
    % Copy this before \\begin{document}\n",
    -       "\n",
    -       "\\usepackage[normalem]{ulem}\n",
    -       "\\newenvironment{mld}\n",
    -       "  {\\par\\begin{minipage}{\\linewidth}\\begin{tabular}{rp{0.7\\linewidth}}}\n",
    -       "  {\\end{tabular}\\end{minipage}\\par}\n",
    -       "\\newcommand{\\relat}[1]{\\textsc{#1}}\n",
    -       "\\newcommand{\\attr}[1]{\\emph{#1}}\n",
    -       "\\newcommand{\\prim}[1]{\\uline{#1}}\n",
    -       "\\newcommand{\\foreign}[1]{\\#\\textsl{#1}}\n",
    -       "\n",
    -       "% Copy that after \\begin{document}\n",
    -       "\n",
    -       "\\begin{mld}\n",
    -       "  Client & (\\prim{Réf. client}, \\attr{Nom}, \\attr{Prénom}, \\attr{Adresse})\\\\\n",
    -       "  Commande & (\\prim{Num commande}, \\attr{Date}, \\attr{Montant}, \\foreign{Réf. client})\\\\\n",
    -       "  Inclure & (\\foreign{\\prim{Num commande}}, \\foreign{\\prim{Réf. produit}}, \\attr{Quantité})\\\\\n",
    -       "  Produit & (\\prim{Réf. produit}, \\attr{Libellé}, \\attr{Prix unitaire})\\\\\n",
    -       "\\end{mld}\n",
    -       "
    \n" + ".output_html .s2 { color: #BA212" ], "text/latex": [ "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n", @@ -17099,9 +17306,18 @@ "\\end{mld}" ] }, - "execution_count": 118, + "execution_count": 120, "metadata": {}, "output_type": "execute_result" + }, + { + "data": { + "text/html": [ + "limit_output extension: Maximum message size of 4000 exceeded with 8654 characters" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ @@ -17139,17 +17355,17 @@ }, { "cell_type": "code", - "execution_count": 119, + "execution_count": 121, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t0,N\n", "\t\n", @@ -17161,7 +17377,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -17177,7 +17393,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -17193,7 +17409,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -17208,7 +17424,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -17242,7 +17458,7 @@ }, { "cell_type": "code", - "execution_count": 120, + "execution_count": 122, "metadata": {}, "outputs": [ { @@ -17270,7 +17486,7 @@ "" ] }, - "execution_count": 120, + "execution_count": 122, "metadata": {}, "output_type": "execute_result" } @@ -17288,17 +17504,17 @@ }, { "cell_type": "code", - "execution_count": 121, + "execution_count": 123, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t0,N\n", "\t\n", @@ -17310,7 +17526,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -17326,7 +17542,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -17342,7 +17558,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -17357,7 +17573,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -17391,7 +17607,7 @@ }, { "cell_type": "code", - "execution_count": 122, + "execution_count": 124, "metadata": {}, "outputs": [ { @@ -17472,7 +17688,7 @@ "" ] }, - "execution_count": 122, + "execution_count": 124, "metadata": {}, "output_type": "execute_result" } @@ -17506,17 +17722,17 @@ }, { "cell_type": "code", - "execution_count": 123, + "execution_count": 125, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t0,N\n", "\t\n", @@ -17528,7 +17744,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -17544,7 +17760,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -17560,7 +17776,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -17575,7 +17791,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -17609,7 +17825,7 @@ }, { "cell_type": "code", - "execution_count": 124, + "execution_count": 126, "metadata": { "scrolled": true }, @@ -17618,10 +17834,10 @@ "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -17637,7 +17853,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -17653,7 +17869,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -17669,7 +17885,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -17713,7 +17929,7 @@ }, { "cell_type": "code", - "execution_count": 125, + "execution_count": 127, "metadata": {}, "outputs": [ { @@ -17775,34 +17991,10 @@ ".output_html .mo { color: #666666 } /* Literal.Number.Oct */\n", ".output_html .sa { color: #BA2121 } /* Literal.String.Affix */\n", ".output_html .sb { color: #BA2121 } /* Literal.String.Backtick */\n", - ".output_html .sc { color: #BA2121 } /* Literal.String.Char */\n", - ".output_html .dl { color: #BA2121 } /* Literal.String.Delimiter */\n", - ".output_html .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */\n", - ".output_html .s2 { color: #BA2121 } /* Literal.String.Double */\n", - ".output_html .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */\n", - ".output_html .sh { color: #BA2121 } /* Literal.String.Heredoc */\n", - ".output_html .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */\n", - ".output_html .sx { color: #008000 } /* Literal.String.Other */\n", - ".output_html .sr { color: #A45A77 } /* Literal.String.Regex */\n", - ".output_html .s1 { color: #BA2121 } /* Literal.String.Single */\n", - ".output_html .ss { color: #19177C } /* Literal.String.Symbol */\n", - ".output_html .bp { color: #008000 } /* Name.Builtin.Pseudo */\n", - ".output_html .fm { color: #0000FF } /* Name.Function.Magic */\n", - ".output_html .vc { color: #19177C } /* Name.Variable.Class */\n", - ".output_html .vg { color: #19177C } /* Name.Variable.Global */\n", - ".output_html .vi { color: #19177C } /* Name.Variable.Instance */\n", - ".output_html .vm { color: #19177C } /* Name.Variable.Magic */\n", - ".output_html .il { color: #666666 } /* Literal.Number.Integer.Long */
    %%mocodo\n",
    -       ":\n",
    -       "CLIENT: Réf. client, Nom, Prénom, Adresse\n",
    -       ":\n",
    -       "COMMANDE: Num commande, Date, Montant, #Réf. client->CLIENT->Réf. client\n",
    -       ":\n",
    -       "INCLURE: #Num commande->COMMANDE->Num commande, _#Réf. produit->PRODUIT->Réf. produit, Quantité\n",
    -       ":\n",
    -       "PRODUIT: Réf. produit, Libellé, Prix unitaire\n",
    -       ":\n",
    -       "
    \n" + ".output_html .sc { color: #BA2121 } /* Literal.String.Char */\n", + ".output_html .dl { color: #BA2121 } /* Literal.String.Delimiter */\n", + ".output_html .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */\n", + ".output_html .s2 { color: #BA212" ], "text/latex": [ "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n", @@ -17831,9 +18023,18 @@ ":" ] }, - "execution_count": 125, + "execution_count": 127, "metadata": {}, "output_type": "execute_result" + }, + { + "data": { + "text/html": [ + "limit_output extension: Maximum message size of 4000 exceeded with 5320 characters" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ @@ -17853,17 +18054,17 @@ }, { "cell_type": "code", - "execution_count": 126, + "execution_count": 128, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -17879,7 +18080,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -17895,7 +18096,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -17911,7 +18112,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -17971,17 +18172,17 @@ }, { "cell_type": "code", - "execution_count": 127, + "execution_count": 129, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -17997,7 +18198,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -18013,7 +18214,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -18029,7 +18230,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -18087,13 +18288,6 @@ "**Limitation.** Les clés étrangères composites sont actuellement représentées comme si elles étaient séparées (autant de flèches que de parties)." ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Nouveauté de la version 2.3.5.** Les tables réduites à une clé primaire non composite sont supprimées et les éventuelles clés étrangères correspondantes perdent leur caractère étranger. Ainsi, dans le diagramme relationnel de l'[introduction](#Introduction), les tables MATIÈRE et DATE ont disparu et les clés étrangères _libellé matière_ et _date_ ne sont pas préfixées d'un dièse ou accompagnées d'une flèche." - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -18126,17 +18320,17 @@ }, { "cell_type": "code", - "execution_count": 128, + "execution_count": 130, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t0,N\n", "\t\n", @@ -18148,7 +18342,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -18164,7 +18358,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -18179,7 +18373,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -18194,7 +18388,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -18235,7 +18429,7 @@ }, { "cell_type": "code", - "execution_count": 129, + "execution_count": 131, "metadata": {}, "outputs": [ { @@ -18300,56 +18494,7 @@ ".output_html .sc { color: #BA2121 } /* Literal.String.Char */\n", ".output_html .dl { color: #BA2121 } /* Literal.String.Delimiter */\n", ".output_html .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */\n", - ".output_html .s2 { color: #BA2121 } /* Literal.String.Double */\n", - ".output_html .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */\n", - ".output_html .sh { color: #BA2121 } /* Literal.String.Heredoc */\n", - ".output_html .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */\n", - ".output_html .sx { color: #008000 } /* Literal.String.Other */\n", - ".output_html .sr { color: #A45A77 } /* Literal.String.Regex */\n", - ".output_html .s1 { color: #BA2121 } /* Literal.String.Single */\n", - ".output_html .ss { color: #19177C } /* Literal.String.Symbol */\n", - ".output_html .bp { color: #008000 } /* Name.Builtin.Pseudo */\n", - ".output_html .fm { color: #0000FF } /* Name.Function.Magic */\n", - ".output_html .vc { color: #19177C } /* Name.Variable.Class */\n", - ".output_html .vg { color: #19177C } /* Name.Variable.Global */\n", - ".output_html .vi { color: #19177C } /* Name.Variable.Instance */\n", - ".output_html .vm { color: #19177C } /* Name.Variable.Magic */\n", - ".output_html .il { color: #666666 } /* Literal.Number.Integer.Long */
    CREATE DATABASE IF NOT EXISTS `CLIENT_COMMANDE_PRODUIT` DEFAULT CHARACTER SET UTF8MB4 COLLATE utf8_general_ci;\n",
    -       "USE `CLIENT_COMMANDE_PRODUIT`;\n",
    -       "\n",
    -       "CREATE TABLE `CLIENT` (\n",
    -       "  `réf_client` varchar(8),\n",
    -       "  `nom` varchar(20),\n",
    -       "  `adresse` varchar(40),\n",
    -       "  PRIMARY KEY (`réf_client`)\n",
    -       ") ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4;\n",
    -       "\n",
    -       "CREATE TABLE `COMMANDE` (\n",
    -       "  `num_commande` tinyint(4),\n",
    -       "  `date` date,\n",
    -       "  `montant` decimal(5,2) DEFAULT '0.00',\n",
    -       "  `réf_client` varchar(8),\n",
    -       "  PRIMARY KEY (`num_commande`)\n",
    -       ") ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4;\n",
    -       "\n",
    -       "CREATE TABLE `INCLURE` (\n",
    -       "  `num_commande` tinyint(4),\n",
    -       "  `réf_produit` varchar(8),\n",
    -       "  `quantité` tinyint(4),\n",
    -       "  PRIMARY KEY (`num_commande`, `réf_produit`)\n",
    -       ") ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4;\n",
    -       "\n",
    -       "CREATE TABLE `PRODUIT` (\n",
    -       "  `réf_produit` varchar(8),\n",
    -       "  `libellé` varchar(20),\n",
    -       "  `prix_unitaire` decimal(5,2),\n",
    -       "  PRIMARY KEY (`réf_produit`)\n",
    -       ") ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4;\n",
    -       "\n",
    -       "ALTER TABLE `COMMANDE` ADD FOREIGN KEY (`réf_client`) REFERENCES `CLIENT` (`réf_client`);\n",
    -       "ALTER TABLE `INCLURE` ADD FOREIGN KEY (`réf_produit`) REFERENCES `PRODUIT` (`réf_produit`);\n",
    -       "ALTER TABLE `INCLURE` ADD FOREIGN KEY (`num_commande`) REFERENCES `COMMANDE` (`num_commande`);\n",
    -       "
    \n" + ".output_html .s2 { color: #BA212" ], "text/latex": [ "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n", @@ -18428,9 +18573,18 @@ "ALTER TABLE `INCLURE` ADD FOREIGN KEY (`num_commande`) REFERENCES `COMMANDE` (`num_commande`);" ] }, - "execution_count": 129, + "execution_count": 131, "metadata": {}, "output_type": "execute_result" + }, + { + "data": { + "text/html": [ + "limit_output extension: Maximum message size of 4000 exceeded with 14290 characters" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ @@ -18446,17 +18600,17 @@ }, { "cell_type": "code", - "execution_count": 130, + "execution_count": 132, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t0,N\n", "\t\n", @@ -18472,7 +18626,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -18488,7 +18642,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t0,N\n", "\t\n", @@ -18504,7 +18658,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -18518,7 +18672,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -18532,7 +18686,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -18546,7 +18700,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -18581,7 +18735,7 @@ }, { "cell_type": "code", - "execution_count": 131, + "execution_count": 133, "metadata": {}, "outputs": [ { @@ -18646,55 +18800,7 @@ ".output_html .sc { color: #BA2121 } /* Literal.String.Char */\n", ".output_html .dl { color: #BA2121 } /* Literal.String.Delimiter */\n", ".output_html .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */\n", - ".output_html .s2 { color: #BA2121 } /* Literal.String.Double */\n", - ".output_html .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */\n", - ".output_html .sh { color: #BA2121 } /* Literal.String.Heredoc */\n", - ".output_html .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */\n", - ".output_html .sx { color: #008000 } /* Literal.String.Other */\n", - ".output_html .sr { color: #A45A77 } /* Literal.String.Regex */\n", - ".output_html .s1 { color: #BA2121 } /* Literal.String.Single */\n", - ".output_html .ss { color: #19177C } /* Literal.String.Symbol */\n", - ".output_html .bp { color: #008000 } /* Name.Builtin.Pseudo */\n", - ".output_html .fm { color: #0000FF } /* Name.Function.Magic */\n", - ".output_html .vc { color: #19177C } /* Name.Variable.Class */\n", - ".output_html .vg { color: #19177C } /* Name.Variable.Global */\n", - ".output_html .vi { color: #19177C } /* Name.Variable.Instance */\n", - ".output_html .vm { color: #19177C } /* Name.Variable.Magic */\n", - ".output_html .il { color: #666666 } /* Literal.Number.Integer.Long */
    .open "APPARTEMENTS";\n",
    -       "\n",
    -       "CREATE TABLE "APPARTEMENT" (\n",
    -       "  "code_rue" VARCHAR(42),\n",
    -       "  "num_immeuble" VARCHAR(42),\n",
    -       "  "num_étage" VARCHAR(42),\n",
    -       "  "num_appart" VARCHAR(42),\n",
    -       "  "nb_pièces_appart" VARCHAR(42),\n",
    -       "  PRIMARY KEY ("code_rue", "num_immeuble", "num_étage", "num_appart"),\n",
    -       "  FOREIGN KEY ("code_rue", "num_immeuble", "num_étage") REFERENCES "ÉTAGE" ("code_rue", "num_immeuble", "num_étage")\n",
    -       ");\n",
    -       "\n",
    -       "CREATE TABLE "IMMEUBLE" (\n",
    -       "  "code_rue" VARCHAR(42),\n",
    -       "  "num_immeuble" VARCHAR(42),\n",
    -       "  "nb_étages_immeuble" VARCHAR(42),\n",
    -       "  PRIMARY KEY ("code_rue", "num_immeuble"),\n",
    -       "  FOREIGN KEY ("code_rue") REFERENCES "RUE" ("code_rue")\n",
    -       ");\n",
    -       "\n",
    -       "CREATE TABLE "RUE" (\n",
    -       "  "code_rue" VARCHAR(42),\n",
    -       "  "nom_rue" VARCHAR(42),\n",
    -       "  PRIMARY KEY ("code_rue")\n",
    -       ");\n",
    -       "\n",
    -       "CREATE TABLE "ÉTAGE" (\n",
    -       "  "code_rue" VARCHAR(42),\n",
    -       "  "num_immeuble" VARCHAR(42),\n",
    -       "  "num_étage" VARCHAR(42),\n",
    -       "  "nb_appart_étage" VARCHAR(42),\n",
    -       "  PRIMARY KEY ("code_rue", "num_immeuble", "num_étage"),\n",
    -       "  FOREIGN KEY ("code_rue", "num_immeuble") REFERENCES "IMMEUBLE" ("code_rue", "num_immeuble")\n",
    -       ");\n",
    -       "
    \n" + ".output_html .s2 { color: #BA212" ], "text/latex": [ "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n", @@ -18771,9 +18877,18 @@ ");" ] }, - "execution_count": 131, + "execution_count": 133, "metadata": {}, "output_type": "execute_result" + }, + { + "data": { + "text/html": [ + "limit_output extension: Maximum message size of 4000 exceeded with 13013 characters" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ @@ -18796,7 +18911,7 @@ }, { "cell_type": "code", - "execution_count": 132, + "execution_count": 134, "metadata": {}, "outputs": [], "source": [ @@ -18810,7 +18925,7 @@ }, { "cell_type": "code", - "execution_count": 133, + "execution_count": 135, "metadata": {}, "outputs": [ { @@ -18833,7 +18948,7 @@ "" ] }, - "execution_count": 133, + "execution_count": 135, "metadata": {}, "output_type": "execute_result" } @@ -18851,7 +18966,7 @@ }, { "cell_type": "code", - "execution_count": 134, + "execution_count": 136, "metadata": {}, "outputs": [], "source": [ @@ -18865,7 +18980,7 @@ }, { "cell_type": "code", - "execution_count": 135, + "execution_count": 137, "metadata": {}, "outputs": [ { @@ -18887,7 +19002,7 @@ "" ] }, - "execution_count": 135, + "execution_count": 137, "metadata": {}, "output_type": "execute_result" } @@ -18972,9 +19087,8 @@ " 3. la composition `\"compose_[attribute_nature]\"` est appliquée, _cf._ le paragraphe [Composition des attributs selon leur nature](#Composition-des-attributs-selon-leur-nature). Le résultat est accumulé dans une liste de colonnes, en deux versions: dans l'ordre de leur énumération, ou triée selon la clé spécifiée dans `\"column_sorting_key\"`.\n", " 4. `\"column_separator\"` joint chacune de ces listes de chaînes et associe le résultat à l'identificateur `\"columns\"` et `\"sorted_columns\"` (respectivement).\n", " 5. `\"compose_relation\"` construit une relation complète avec tous ses attributs. Par exemple, et c'est la valeur par défaut, `\"{this_relation_name} ({columns})\"` est utilisé dans les [formats linéaires](#Formats-lin%C3%A9aires).\n", - " 6. `\"transform_single_column_relation\"` s'applique à ce dernier résultat lorsque la relation est réduite à un seul attribut (l'usage est d'en proposer la suppression en la mettant en commentaire).\n", - " 7. `\"transform_forced_relation\"` est appliqué aux associations DF dont la conversion en table a été forcée manuellement.\n", - " 8. `\"transform_relation\"` est appliqué systématiquement, et le résultat est accumulé dans une liste de relations, en deux versions: dans l'ordre de leur énumération, ou triée selon la clé spécifiée dans `\"relation_sorting_key\"`.\n", + " 6. `\"transform_forced_relation\"` est appliqué aux associations DF dont la conversion en table a été forcée manuellement.\n", + " 7. `\"transform_relation\"` est appliqué systématiquement, et le résultat est accumulé dans une liste de relations, en deux versions: dans l'ordre de leur énumération, ou triée selon la clé spécifiée dans `\"relation_sorting_key\"`.\n", "8. `\"relation_separator\"` joint chacune de ces listes de chaînes et associe le résultat à l'identificateur `\"relations\"` et `\"sorted_relations\"` (respectivement).\n", "9. `\"compose_relational_schema\"` construit un schéma relationnel complet avec son titre et toutes ses relations. La valeur par défaut est simplement `\"{relations}\"`.\n", "10. `\"transform_relational_schema\"` applique une dernière transformation au schéma complet, et renvoie le résultat final." @@ -18996,17 +19110,17 @@ }, { "cell_type": "code", - "execution_count": 136, + "execution_count": 138, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t0,N\n", "\t\n", @@ -19018,7 +19132,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -19034,7 +19148,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -19050,7 +19164,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -19065,7 +19179,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -19114,7 +19228,7 @@ }, { "cell_type": "code", - "execution_count": 137, + "execution_count": 139, "metadata": { "scrolled": false }, @@ -19181,401 +19295,7 @@ ".output_html .sc { color: #BA2121 } /* Literal.String.Char */\n", ".output_html .dl { color: #BA2121 } /* Literal.String.Delimiter */\n", ".output_html .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */\n", - ".output_html .s2 { color: #BA2121 } /* Literal.String.Double */\n", - ".output_html .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */\n", - ".output_html .sh { color: #BA2121 } /* Literal.String.Heredoc */\n", - ".output_html .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */\n", - ".output_html .sx { color: #008000 } /* Literal.String.Other */\n", - ".output_html .sr { color: #A45A77 } /* Literal.String.Regex */\n", - ".output_html .s1 { color: #BA2121 } /* Literal.String.Single */\n", - ".output_html .ss { color: #19177C } /* Literal.String.Symbol */\n", - ".output_html .bp { color: #008000 } /* Name.Builtin.Pseudo */\n", - ".output_html .fm { color: #0000FF } /* Name.Function.Magic */\n", - ".output_html .vc { color: #19177C } /* Name.Variable.Class */\n", - ".output_html .vg { color: #19177C } /* Name.Variable.Global */\n", - ".output_html .vi { color: #19177C } /* Name.Variable.Instance */\n", - ".output_html .vm { color: #19177C } /* Name.Variable.Magic */\n", - ".output_html .il { color: #666666 } /* Literal.Number.Integer.Long */
    {\n",
    -       "  "title": "client_commande_produit",\n",
    -       "  "title_lowercase": "client_commande_produit",\n",
    -       "  "title_uppercase": "CLIENT_COMMANDE_PRODUIT",\n",
    -       "  "title_titlecase": "Client_commande_produit",\n",
    -       "  "relations": [\n",
    -       "    {\n",
    -       "      "this_relation_name": "CLIENT",\n",
    -       "      "this_relation_name_lowercase": "client",\n",
    -       "      "this_relation_name_uppercase": "CLIENT",\n",
    -       "      "this_relation_name_titlecase": "Client",\n",
    -       "      "is_forced": "False",\n",
    -       "      "columns": [\n",
    -       "        {\n",
    -       "          "attribute": "Réf. client",\n",
    -       "          "raw_label": "Réf. client",\n",
    -       "          "raw_label_lowercase": "réf. client",\n",
    -       "          "raw_label_uppercase": "RÉF. CLIENT",\n",
    -       "          "raw_label_titlecase": "Réf. client",\n",
    -       "          "disambiguation_number": null,\n",
    -       "          "label": "Réf. client",\n",
    -       "          "label_lowercase": "réf. client",\n",
    -       "          "label_uppercase": "RÉF. CLIENT",\n",
    -       "          "label_titlecase": "Réf. client",\n",
    -       "          "primary": true,\n",
    -       "          "nature": "primary_key",\n",
    -       "          "data_type": null,\n",
    -       "          "association_name": null,\n",
    -       "          "association_name_lower_case": null,\n",
    -       "          "association_name_uppercase": null,\n",
    -       "          "association_name_titlecase": null,\n",
    -       "          "leg_note": null,\n",
    -       "          "outer_source": null,\n",
    -       "          "outer_source_lowercase": null,\n",
    -       "          "outer_source_uppercase": null,\n",
    -       "          "outer_source_titlecase": null\n",
    -       "        },\n",
    -       "        {\n",
    -       "          "attribute": "Nom",\n",
    -       "          "raw_label": "Nom",\n",
    -       "          "raw_label_lowercase": "nom",\n",
    -       "          "raw_label_uppercase": "NOM",\n",
    -       "          "raw_label_titlecase": "Nom",\n",
    -       "          "disambiguation_number": null,\n",
    -       "          "label": "Nom",\n",
    -       "          "label_lowercase": "nom",\n",
    -       "          "label_uppercase": "NOM",\n",
    -       "          "label_titlecase": "Nom",\n",
    -       "          "primary": false,\n",
    -       "          "nature": "normal_attribute",\n",
    -       "          "data_type": null,\n",
    -       "          "association_name": null,\n",
    -       "          "association_name_lower_case": null,\n",
    -       "          "association_name_uppercase": null,\n",
    -       "          "association_name_titlecase": null,\n",
    -       "          "leg_note": null,\n",
    -       "          "outer_source": null,\n",
    -       "          "outer_source_lowercase": null,\n",
    -       "          "outer_source_uppercase": null,\n",
    -       "          "outer_source_titlecase": null\n",
    -       "        },\n",
    -       "        {\n",
    -       "          "attribute": "Prénom",\n",
    -       "          "raw_label": "Prénom",\n",
    -       "          "raw_label_lowercase": "prénom",\n",
    -       "          "raw_label_uppercase": "PRÉNOM",\n",
    -       "          "raw_label_titlecase": "Prénom",\n",
    -       "          "disambiguation_number": null,\n",
    -       "          "label": "Prénom",\n",
    -       "          "label_lowercase": "prénom",\n",
    -       "          "label_uppercase": "PRÉNOM",\n",
    -       "          "label_titlecase": "Prénom",\n",
    -       "          "primary": false,\n",
    -       "          "nature": "normal_attribute",\n",
    -       "          "data_type": null,\n",
    -       "          "association_name": null,\n",
    -       "          "association_name_lower_case": null,\n",
    -       "          "association_name_uppercase": null,\n",
    -       "          "association_name_titlecase": null,\n",
    -       "          "leg_note": null,\n",
    -       "          "outer_source": null,\n",
    -       "          "outer_source_lowercase": null,\n",
    -       "          "outer_source_uppercase": null,\n",
    -       "          "outer_source_titlecase": null\n",
    -       "        },\n",
    -       "        {\n",
    -       "          "attribute": "Adresse",\n",
    -       "          "raw_label": "Adresse",\n",
    -       "          "raw_label_lowercase": "adresse",\n",
    -       "          "raw_label_uppercase": "ADRESSE",\n",
    -       "          "raw_label_titlecase": "Adresse",\n",
    -       "          "disambiguation_number": null,\n",
    -       "          "label": "Adresse",\n",
    -       "          "label_lowercase": "adresse",\n",
    -       "          "label_uppercase": "ADRESSE",\n",
    -       "          "label_titlecase": "Adresse",\n",
    -       "          "primary": false,\n",
    -       "          "nature": "normal_attribute",\n",
    -       "          "data_type": null,\n",
    -       "          "association_name": null,\n",
    -       "          "association_name_lower_case": null,\n",
    -       "          "association_name_uppercase": null,\n",
    -       "          "association_name_titlecase": null,\n",
    -       "          "leg_note": null,\n",
    -       "          "outer_source": null,\n",
    -       "          "outer_source_lowercase": null,\n",
    -       "          "outer_source_uppercase": null,\n",
    -       "          "outer_source_titlecase": null\n",
    -       "        }\n",
    -       "      ]\n",
    -       "    },\n",
    -       "    {\n",
    -       "      "this_relation_name": "COMMANDE",\n",
    -       "      "this_relation_name_lowercase": "commande",\n",
    -       "      "this_relation_name_uppercase": "COMMANDE",\n",
    -       "      "this_relation_name_titlecase": "Commande",\n",
    -       "      "is_forced": "False",\n",
    -       "      "columns": [\n",
    -       "        {\n",
    -       "          "attribute": "Num commande",\n",
    -       "          "raw_label": "Num commande",\n",
    -       "          "raw_label_lowercase": "num commande",\n",
    -       "          "raw_label_uppercase": "NUM COMMANDE",\n",
    -       "          "raw_label_titlecase": "Num commande",\n",
    -       "          "disambiguation_number": null,\n",
    -       "          "label": "Num commande",\n",
    -       "          "label_lowercase": "num commande",\n",
    -       "          "label_uppercase": "NUM COMMANDE",\n",
    -       "          "label_titlecase": "Num commande",\n",
    -       "          "primary": true,\n",
    -       "          "nature": "primary_key",\n",
    -       "          "data_type": null,\n",
    -       "          "association_name": null,\n",
    -       "          "association_name_lower_case": null,\n",
    -       "          "association_name_uppercase": null,\n",
    -       "          "association_name_titlecase": null,\n",
    -       "          "leg_note": null,\n",
    -       "          "outer_source": null,\n",
    -       "          "outer_source_lowercase": null,\n",
    -       "          "outer_source_uppercase": null,\n",
    -       "          "outer_source_titlecase": null\n",
    -       "        },\n",
    -       "        {\n",
    -       "          "attribute": "Date",\n",
    -       "          "raw_label": "Date",\n",
    -       "          "raw_label_lowercase": "date",\n",
    -       "          "raw_label_uppercase": "DATE",\n",
    -       "          "raw_label_titlecase": "Date",\n",
    -       "          "disambiguation_number": null,\n",
    -       "          "label": "Date",\n",
    -       "          "label_lowercase": "date",\n",
    -       "          "label_uppercase": "DATE",\n",
    -       "          "label_titlecase": "Date",\n",
    -       "          "primary": false,\n",
    -       "          "nature": "normal_attribute",\n",
    -       "          "data_type": null,\n",
    -       "          "association_name": null,\n",
    -       "          "association_name_lower_case": null,\n",
    -       "          "association_name_uppercase": null,\n",
    -       "          "association_name_titlecase": null,\n",
    -       "          "leg_note": null,\n",
    -       "          "outer_source": null,\n",
    -       "          "outer_source_lowercase": null,\n",
    -       "          "outer_source_uppercase": null,\n",
    -       "          "outer_source_titlecase": null\n",
    -       "        },\n",
    -       "        {\n",
    -       "          "attribute": "Montant",\n",
    -       "          "raw_label": "Montant",\n",
    -       "          "raw_label_lowercase": "montant",\n",
    -       "          "raw_label_uppercase": "MONTANT",\n",
    -       "          "raw_label_titlecase": "Montant",\n",
    -       "          "disambiguation_number": null,\n",
    -       "          "label": "Montant",\n",
    -       "          "label_lowercase": "montant",\n",
    -       "          "label_uppercase": "MONTANT",\n",
    -       "          "label_titlecase": "Montant",\n",
    -       "          "primary": false,\n",
    -       "          "nature": "normal_attribute",\n",
    -       "          "data_type": null,\n",
    -       "          "association_name": null,\n",
    -       "          "association_name_lower_case": null,\n",
    -       "          "association_name_uppercase": null,\n",
    -       "          "association_name_titlecase": null,\n",
    -       "          "leg_note": null,\n",
    -       "          "outer_source": null,\n",
    -       "          "outer_source_lowercase": null,\n",
    -       "          "outer_source_uppercase": null,\n",
    -       "          "outer_source_titlecase": null\n",
    -       "        },\n",
    -       "        {\n",
    -       "          "attribute": "Réf. client",\n",
    -       "          "raw_label": "Réf. client",\n",
    -       "          "raw_label_lowercase": "réf. client",\n",
    -       "          "raw_label_uppercase": "RÉF. CLIENT",\n",
    -       "          "raw_label_titlecase": "Réf. client",\n",
    -       "          "disambiguation_number": null,\n",
    -       "          "label": "Réf. client",\n",
    -       "          "label_lowercase": "réf. client",\n",
    -       "          "label_uppercase": "RÉF. CLIENT",\n",
    -       "          "label_titlecase": "Réf. client",\n",
    -       "          "primary": false,\n",
    -       "          "nature": "foreign_key",\n",
    -       "          "data_type": null,\n",
    -       "          "association_name": "DF",\n",
    -       "          "association_name_lower_case": "df",\n",
    -       "          "association_name_uppercase": "DF",\n",
    -       "          "association_name_titlecase": "Df",\n",
    -       "          "leg_note": null,\n",
    -       "          "outer_source": "CLIENT",\n",
    -       "          "outer_source_lowercase": "client",\n",
    -       "          "outer_source_uppercase": "CLIENT",\n",
    -       "          "outer_source_titlecase": "Client"\n",
    -       "        }\n",
    -       "      ]\n",
    -       "    },\n",
    -       "    {\n",
    -       "      "this_relation_name": "INCLURE",\n",
    -       "      "this_relation_name_lowercase": "inclure",\n",
    -       "      "this_relation_name_uppercase": "INCLURE",\n",
    -       "      "this_relation_name_titlecase": "Inclure",\n",
    -       "      "is_forced": "False",\n",
    -       "      "columns": [\n",
    -       "        {\n",
    -       "          "attribute": "Num commande",\n",
    -       "          "raw_label": "Num commande",\n",
    -       "          "raw_label_lowercase": "num commande",\n",
    -       "          "raw_label_uppercase": "NUM COMMANDE",\n",
    -       "          "raw_label_titlecase": "Num commande",\n",
    -       "          "disambiguation_number": null,\n",
    -       "          "label": "Num commande",\n",
    -       "          "label_lowercase": "num commande",\n",
    -       "          "label_uppercase": "NUM COMMANDE",\n",
    -       "          "label_titlecase": "Num commande",\n",
    -       "          "primary": true,\n",
    -       "          "nature": "primary_foreign_key",\n",
    -       "          "data_type": null,\n",
    -       "          "association_name": "INCLURE",\n",
    -       "          "association_name_lower_case": "inclure",\n",
    -       "          "association_name_uppercase": "INCLURE",\n",
    -       "          "association_name_titlecase": "Inclure",\n",
    -       "          "leg_note": null,\n",
    -       "          "outer_source": "COMMANDE",\n",
    -       "          "outer_source_lowercase": "commande",\n",
    -       "          "outer_source_uppercase": "COMMANDE",\n",
    -       "          "outer_source_titlecase": "Commande"\n",
    -       "        },\n",
    -       "        {\n",
    -       "          "attribute": "Réf. produit",\n",
    -       "          "raw_label": "Réf. produit",\n",
    -       "          "raw_label_lowercase": "réf. produit",\n",
    -       "          "raw_label_uppercase": "RÉF. PRODUIT",\n",
    -       "          "raw_label_titlecase": "Réf. produit",\n",
    -       "          "disambiguation_number": null,\n",
    -       "          "label": "Réf. produit",\n",
    -       "          "label_lowercase": "réf. produit",\n",
    -       "          "label_uppercase": "RÉF. PRODUIT",\n",
    -       "          "label_titlecase": "Réf. produit",\n",
    -       "          "primary": true,\n",
    -       "          "nature": "primary_foreign_key",\n",
    -       "          "data_type": null,\n",
    -       "          "association_name": "INCLURE",\n",
    -       "          "association_name_lower_case": "inclure",\n",
    -       "          "association_name_uppercase": "INCLURE",\n",
    -       "          "association_name_titlecase": "Inclure",\n",
    -       "          "leg_note": null,\n",
    -       "          "outer_source": "PRODUIT",\n",
    -       "          "outer_source_lowercase": "produit",\n",
    -       "          "outer_source_uppercase": "PRODUIT",\n",
    -       "          "outer_source_titlecase": "Produit"\n",
    -       "        },\n",
    -       "        {\n",
    -       "          "attribute": "Quantité",\n",
    -       "          "raw_label": "Quantité",\n",
    -       "          "raw_label_lowercase": "quantité",\n",
    -       "          "raw_label_uppercase": "QUANTITÉ",\n",
    -       "          "raw_label_titlecase": "Quantité",\n",
    -       "          "disambiguation_number": null,\n",
    -       "          "label": "Quantité",\n",
    -       "          "label_lowercase": "quantité",\n",
    -       "          "label_uppercase": "QUANTITÉ",\n",
    -       "          "label_titlecase": "Quantité",\n",
    -       "          "primary": false,\n",
    -       "          "nature": "association_attribute",\n",
    -       "          "data_type": null,\n",
    -       "          "association_name": "INCLURE",\n",
    -       "          "association_name_lower_case": "inclure",\n",
    -       "          "association_name_uppercase": "INCLURE",\n",
    -       "          "association_name_titlecase": "Inclure",\n",
    -       "          "leg_note": null,\n",
    -       "          "outer_source": null,\n",
    -       "          "outer_source_lowercase": null,\n",
    -       "          "outer_source_uppercase": null,\n",
    -       "          "outer_source_titlecase": null\n",
    -       "        }\n",
    -       "      ]\n",
    -       "    },\n",
    -       "    {\n",
    -       "      "this_relation_name": "PRODUIT",\n",
    -       "      "this_relation_name_lowercase": "produit",\n",
    -       "      "this_relation_name_uppercase": "PRODUIT",\n",
    -       "      "this_relation_name_titlecase": "Produit",\n",
    -       "      "is_forced": "False",\n",
    -       "      "columns": [\n",
    -       "        {\n",
    -       "          "attribute": "Réf. produit",\n",
    -       "          "raw_label": "Réf. produit",\n",
    -       "          "raw_label_lowercase": "réf. produit",\n",
    -       "          "raw_label_uppercase": "RÉF. PRODUIT",\n",
    -       "          "raw_label_titlecase": "Réf. produit",\n",
    -       "          "disambiguation_number": null,\n",
    -       "          "label": "Réf. produit",\n",
    -       "          "label_lowercase": "réf. produit",\n",
    -       "          "label_uppercase": "RÉF. PRODUIT",\n",
    -       "          "label_titlecase": "Réf. produit",\n",
    -       "          "primary": true,\n",
    -       "          "nature": "primary_key",\n",
    -       "          "data_type": null,\n",
    -       "          "association_name": null,\n",
    -       "          "association_name_lower_case": null,\n",
    -       "          "association_name_uppercase": null,\n",
    -       "          "association_name_titlecase": null,\n",
    -       "          "leg_note": null,\n",
    -       "          "outer_source": null,\n",
    -       "          "outer_source_lowercase": null,\n",
    -       "          "outer_source_uppercase": null,\n",
    -       "          "outer_source_titlecase": null\n",
    -       "        },\n",
    -       "        {\n",
    -       "          "attribute": "Libellé",\n",
    -       "          "raw_label": "Libellé",\n",
    -       "          "raw_label_lowercase": "libellé",\n",
    -       "          "raw_label_uppercase": "LIBELLÉ",\n",
    -       "          "raw_label_titlecase": "Libellé",\n",
    -       "          "disambiguation_number": null,\n",
    -       "          "label": "Libellé",\n",
    -       "          "label_lowercase": "libellé",\n",
    -       "          "label_uppercase": "LIBELLÉ",\n",
    -       "          "label_titlecase": "Libellé",\n",
    -       "          "primary": false,\n",
    -       "          "nature": "normal_attribute",\n",
    -       "          "data_type": null,\n",
    -       "          "association_name": null,\n",
    -       "          "association_name_lower_case": null,\n",
    -       "          "association_name_uppercase": null,\n",
    -       "          "association_name_titlecase": null,\n",
    -       "          "leg_note": null,\n",
    -       "          "outer_source": null,\n",
    -       "          "outer_source_lowercase": null,\n",
    -       "          "outer_source_uppercase": null,\n",
    -       "          "outer_source_titlecase": null\n",
    -       "        },\n",
    -       "        {\n",
    -       "          "attribute": "Prix unitaire",\n",
    -       "          "raw_label": "Prix unitaire",\n",
    -       "          "raw_label_lowercase": "prix unitaire",\n",
    -       "          "raw_label_uppercase": "PRIX UNITAIRE",\n",
    -       "          "raw_label_titlecase": "Prix unitaire",\n",
    -       "          "disambiguation_number": null,\n",
    -       "          "label": "Prix unitaire",\n",
    -       "          "label_lowercase": "prix unitaire",\n",
    -       "          "label_uppercase": "PRIX UNITAIRE",\n",
    -       "          "label_titlecase": "Prix unitaire",\n",
    -       "          "primary": false,\n",
    -       "          "nature": "normal_attribute",\n",
    -       "          "data_type": null,\n",
    -       "          "association_name": null,\n",
    -       "          "association_name_lower_case": null,\n",
    -       "          "association_name_uppercase": null,\n",
    -       "          "association_name_titlecase": null,\n",
    -       "          "leg_note": null,\n",
    -       "          "outer_source": null,\n",
    -       "          "outer_source_lowercase": null,\n",
    -       "          "outer_source_uppercase": null,\n",
    -       "          "outer_source_titlecase": null\n",
    -       "        }\n",
    -       "      ]\n",
    -       "    }\n",
    -       "  ]\n",
    -       "}\n",
    -       "
    \n" + ".output_html .s2 { color: #BA212" ], "text/latex": [ "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n", @@ -20075,278 +19795,21 @@ " },\n", " {\n", " \"this_relation_name\": \"COMMANDE\",\n", - " \"this_relation_name_lowercase\": \"commande\",\n", - " \"this_relation_name_uppercase\": \"COMMANDE\",\n", - " \"this_relation_name_titlecase\": \"Commande\",\n", - " \"is_forced\": \"False\",\n", - " \"columns\": [\n", - " {\n", - " \"attribute\": \"Num commande\",\n", - " \"raw_label\": \"Num commande\",\n", - " \"raw_label_lowercase\": \"num commande\",\n", - " \"raw_label_uppercase\": \"NUM COMMANDE\",\n", - " \"raw_label_titlecase\": \"Num commande\",\n", - " \"disambiguation_number\": null,\n", - " \"label\": \"Num commande\",\n", - " \"label_lowercase\": \"num commande\",\n", - " \"label_uppercase\": \"NUM COMMANDE\",\n", - " \"label_titlecase\": \"Num commande\",\n", - " \"primary\": true,\n", - " \"nature\": \"primary_key\",\n", - " \"data_type\": null,\n", - " \"association_name\": null,\n", - " \"association_name_lower_case\": null,\n", - " \"association_name_uppercase\": null,\n", - " \"association_name_titlecase\": null,\n", - " \"leg_note\": null,\n", - " \"outer_source\": null,\n", - " \"outer_source_lowercase\": null,\n", - " \"outer_source_uppercase\": null,\n", - " \"outer_source_titlecase\": null\n", - " },\n", - " {\n", - " \"attribute\": \"Date\",\n", - " \"raw_label\": \"Date\",\n", - " \"raw_label_lowercase\": \"date\",\n", - " \"raw_label_uppercase\": \"DATE\",\n", - " \"raw_label_titlecase\": \"Date\",\n", - " \"disambiguation_number\": null,\n", - " \"label\": \"Date\",\n", - " \"label_lowercase\": \"date\",\n", - " \"label_uppercase\": \"DATE\",\n", - " \"label_titlecase\": \"Date\",\n", - " \"primary\": false,\n", - " \"nature\": \"normal_attribute\",\n", - " \"data_type\": null,\n", - " \"association_name\": null,\n", - " \"association_name_lower_case\": null,\n", - " \"association_name_uppercase\": null,\n", - " \"association_name_titlecase\": null,\n", - " \"leg_note\": null,\n", - " \"outer_source\": null,\n", - " \"outer_source_lowercase\": null,\n", - " \"outer_source_uppercase\": null,\n", - " \"outer_source_titlecase\": null\n", - " },\n", - " {\n", - " \"attribute\": \"Montant\",\n", - " \"raw_label\": \"Montant\",\n", - " \"raw_label_lowercase\": \"montant\",\n", - " \"raw_label_uppercase\": \"MONTANT\",\n", - " \"raw_label_titlecase\": \"Montant\",\n", - " \"disambiguation_number\": null,\n", - " \"label\": \"Montant\",\n", - " \"label_lowercase\": \"montant\",\n", - " \"label_uppercase\": \"MONTANT\",\n", - " \"label_titlecase\": \"Montant\",\n", - " \"primary\": false,\n", - " \"nature\": \"normal_attribute\",\n", - " \"data_type\": null,\n", - " \"association_name\": null,\n", - " \"association_name_lower_case\": null,\n", - " \"association_name_uppercase\": null,\n", - " \"association_name_titlecase\": null,\n", - " \"leg_note\": null,\n", - " \"outer_source\": null,\n", - " \"outer_source_lowercase\": null,\n", - " \"outer_source_uppercase\": null,\n", - " \"outer_source_titlecase\": null\n", - " },\n", - " {\n", - " \"attribute\": \"Réf. client\",\n", - " \"raw_label\": \"Réf. client\",\n", - " \"raw_label_lowercase\": \"réf. client\",\n", - " \"raw_label_uppercase\": \"RÉF. CLIENT\",\n", - " \"raw_label_titlecase\": \"Réf. client\",\n", - " \"disambiguation_number\": null,\n", - " \"label\": \"Réf. client\",\n", - " \"label_lowercase\": \"réf. client\",\n", - " \"label_uppercase\": \"RÉF. CLIENT\",\n", - " \"label_titlecase\": \"Réf. client\",\n", - " \"primary\": false,\n", - " \"nature\": \"foreign_key\",\n", - " \"data_type\": null,\n", - " \"association_name\": \"DF\",\n", - " \"association_name_lower_case\": \"df\",\n", - " \"association_name_uppercase\": \"DF\",\n", - " \"association_name_titlecase\": \"Df\",\n", - " \"leg_note\": null,\n", - " \"outer_source\": \"CLIENT\",\n", - " \"outer_source_lowercase\": \"client\",\n", - " \"outer_source_uppercase\": \"CLIENT\",\n", - " \"outer_source_titlecase\": \"Client\"\n", - " }\n", - " ]\n", - " },\n", - " {\n", - " \"this_relation_name\": \"INCLURE\",\n", - " \"this_relation_name_lowercase\": \"inclure\",\n", - " \"this_relation_name_uppercase\": \"INCLURE\",\n", - " \"this_relation_name_titlecase\": \"Inclure\",\n", - " \"is_forced\": \"False\",\n", - " \"columns\": [\n", - " {\n", - " \"attribute\": \"Num commande\",\n", - " \"raw_label\": \"Num commande\",\n", - " \"raw_label_lowercase\": \"num commande\",\n", - " \"raw_label_uppercase\": \"NUM COMMANDE\",\n", - " \"raw_label_titlecase\": \"Num commande\",\n", - " \"disambiguation_number\": null,\n", - " \"label\": \"Num commande\",\n", - " \"label_lowercase\": \"num commande\",\n", - " \"label_uppercase\": \"NUM COMMANDE\",\n", - " \"label_titlecase\": \"Num commande\",\n", - " \"primary\": true,\n", - " \"nature\": \"primary_foreign_key\",\n", - " \"data_type\": null,\n", - " \"association_name\": \"INCLURE\",\n", - " \"association_name_lower_case\": \"inclure\",\n", - " \"association_name_uppercase\": \"INCLURE\",\n", - " \"association_name_titlecase\": \"Inclure\",\n", - " \"leg_note\": null,\n", - " \"outer_source\": \"COMMANDE\",\n", - " \"outer_source_lowercase\": \"commande\",\n", - " \"outer_source_uppercase\": \"COMMANDE\",\n", - " \"outer_source_titlecase\": \"Commande\"\n", - " },\n", - " {\n", - " \"attribute\": \"Réf. produit\",\n", - " \"raw_label\": \"Réf. produit\",\n", - " \"raw_label_lowercase\": \"réf. produit\",\n", - " \"raw_label_uppercase\": \"RÉF. PRODUIT\",\n", - " \"raw_label_titlecase\": \"Réf. produit\",\n", - " \"disambiguation_number\": null,\n", - " \"label\": \"Réf. produit\",\n", - " \"label_lowercase\": \"réf. produit\",\n", - " \"label_uppercase\": \"RÉF. PRODUIT\",\n", - " \"label_titlecase\": \"Réf. produit\",\n", - " \"primary\": true,\n", - " \"nature\": \"primary_foreign_key\",\n", - " \"data_type\": null,\n", - " \"association_name\": \"INCLURE\",\n", - " \"association_name_lower_case\": \"inclure\",\n", - " \"association_name_uppercase\": \"INCLURE\",\n", - " \"association_name_titlecase\": \"Inclure\",\n", - " \"leg_note\": null,\n", - " \"outer_source\": \"PRODUIT\",\n", - " \"outer_source_lowercase\": \"produit\",\n", - " \"outer_source_uppercase\": \"PRODUIT\",\n", - " \"outer_source_titlecase\": \"Produit\"\n", - " },\n", - " {\n", - " \"attribute\": \"Quantité\",\n", - " \"raw_label\": \"Quantité\",\n", - " \"raw_label_lowercase\": \"quantité\",\n", - " \"raw_label_uppercase\": \"QUANTITÉ\",\n", - " \"raw_label_titlecase\": \"Quantité\",\n", - " \"disambiguation_number\": null,\n", - " \"label\": \"Quantité\",\n", - " \"label_lowercase\": \"quantité\",\n", - " \"label_uppercase\": \"QUANTITÉ\",\n", - " \"label_titlecase\": \"Quantité\",\n", - " \"primary\": false,\n", - " \"nature\": \"association_attribute\",\n", - " \"data_type\": null,\n", - " \"association_name\": \"INCLURE\",\n", - " \"association_name_lower_case\": \"inclure\",\n", - " \"association_name_uppercase\": \"INCLURE\",\n", - " \"association_name_titlecase\": \"Inclure\",\n", - " \"leg_note\": null,\n", - " \"outer_source\": null,\n", - " \"outer_source_lowercase\": null,\n", - " \"outer_source_uppercase\": null,\n", - " \"outer_source_titlecase\": null\n", - " }\n", - " ]\n", - " },\n", - " {\n", - " \"this_relation_name\": \"PRODUIT\",\n", - " \"this_relation_name_lowercase\": \"produit\",\n", - " \"this_relation_name_uppercase\": \"PRODUIT\",\n", - " \"this_relation_name_titlecase\": \"Produit\",\n", - " \"is_forced\": \"False\",\n", - " \"columns\": [\n", - " {\n", - " \"attribute\": \"Réf. produit\",\n", - " \"raw_label\": \"Réf. produit\",\n", - " \"raw_label_lowercase\": \"réf. produit\",\n", - " \"raw_label_uppercase\": \"RÉF. PRODUIT\",\n", - " \"raw_label_titlecase\": \"Réf. produit\",\n", - " \"disambiguation_number\": null,\n", - " \"label\": \"Réf. produit\",\n", - " \"label_lowercase\": \"réf. produit\",\n", - " \"label_uppercase\": \"RÉF. PRODUIT\",\n", - " \"label_titlecase\": \"Réf. produit\",\n", - " \"primary\": true,\n", - " \"nature\": \"primary_key\",\n", - " \"data_type\": null,\n", - " \"association_name\": null,\n", - " \"association_name_lower_case\": null,\n", - " \"association_name_uppercase\": null,\n", - " \"association_name_titlecase\": null,\n", - " \"leg_note\": null,\n", - " \"outer_source\": null,\n", - " \"outer_source_lowercase\": null,\n", - " \"outer_source_uppercase\": null,\n", - " \"outer_source_titlecase\": null\n", - " },\n", - " {\n", - " \"attribute\": \"Libellé\",\n", - " \"raw_label\": \"Libellé\",\n", - " \"raw_label_lowercase\": \"libellé\",\n", - " \"raw_label_uppercase\": \"LIBELLÉ\",\n", - " \"raw_label_titlecase\": \"Libellé\",\n", - " \"disambiguation_number\": null,\n", - " \"label\": \"Libellé\",\n", - " \"label_lowercase\": \"libellé\",\n", - " \"label_uppercase\": \"LIBELLÉ\",\n", - " \"label_titlecase\": \"Libellé\",\n", - " \"primary\": false,\n", - " \"nature\": \"normal_attribute\",\n", - " \"data_type\": null,\n", - " \"association_name\": null,\n", - " \"association_name_lower_case\": null,\n", - " \"association_name_uppercase\": null,\n", - " \"association_name_titlecase\": null,\n", - " \"leg_note\": null,\n", - " \"outer_source\": null,\n", - " \"outer_source_lowercase\": null,\n", - " \"outer_source_uppercase\": null,\n", - " \"outer_source_titlecase\": null\n", - " },\n", - " {\n", - " \"attribute\": \"Prix unitaire\",\n", - " \"raw_label\": \"Prix unitaire\",\n", - " \"raw_label_lowercase\": \"prix unitaire\",\n", - " \"raw_label_uppercase\": \"PRIX UNITAIRE\",\n", - " \"raw_label_titlecase\": \"Prix unitaire\",\n", - " \"disambiguation_number\": null,\n", - " \"label\": \"Prix unitaire\",\n", - " \"label_lowercase\": \"prix unitaire\",\n", - " \"label_uppercase\": \"PRIX UNITAIRE\",\n", - " \"label_titlecase\": \"Prix unitaire\",\n", - " \"primary\": false,\n", - " \"nature\": \"normal_attribute\",\n", - " \"data_type\": null,\n", - " \"association_name\": null,\n", - " \"association_name_lower_case\": null,\n", - " \"association_name_uppercase\": null,\n", - " \"association_name_titlecase\": null,\n", - " \"leg_note\": null,\n", - " \"outer_source\": null,\n", - " \"outer_source_lowercase\": null,\n", - " \"outer_source_uppercase\": null,\n", - " \"outer_source_titlecase\": null\n", - " }\n", - " ]\n", - " }\n", - " ]\n", - "}" + " \"this_relation_name_lowercase\": \"comm" ] }, - "execution_count": 137, + "execution_count": 139, "metadata": {}, "output_type": "execute_result" + }, + { + "data": { + "text/html": [ + "limit_output extension: Maximum message size of 4000 exceeded with 81459 characters" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ @@ -20383,17 +19846,17 @@ }, { "cell_type": "code", - "execution_count": 138, + "execution_count": 140, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,1\n", "\t\n", @@ -20409,7 +19872,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -20425,7 +19888,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -20438,7 +19901,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -20452,7 +19915,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -20484,7 +19947,7 @@ }, { "cell_type": "code", - "execution_count": 139, + "execution_count": 141, "metadata": {}, "outputs": [ { @@ -20509,50 +19972,30 @@ "
    Form (\n", " land,\n", " hide,\n", - " #clue,\n", + " clue,\n", " goat\n", " )\n", "
      \n", "
    • Le champ land constitue la clé primaire de la table. C'était déjà un identifiant de l'entité Form.
    • \n", "
    • Le champ hide était déjà un simple attribut de l'entité Form.
    • \n", - "
    • Le champ clue est une clé étrangère. Il a migré par l'association de dépendance fonctionnelle Into à partir de l'entité Riot en perdant son caractère identifiant.
    • \n", + "
    • Le champ clue a migré par l'association de dépendance fonctionnelle Into à partir de l'entité Riot en perdant son caractère identifiant. De plus, comme la table créée à partir de cette entité a été supprimée, il n'est pas considéré comme clé étrangère.
    • \n", "
    • Le champ goat a migré à partir de l'association de dépendance fonctionnelle Into.
    • \n", "
    \n", "
  • \n", "\n", "
    \n", - "
    Read (\n", - " wage\n", - " )\n", - "
      \n", - "
    • Avertissement. Cette table ne comportant qu'un seul champ, on peut envisager de la supprimer.
    • \n", - "
    • Le champ wage constitue la clé primaire de la table. C'était déjà un identifiant de l'entité Read.
    • \n", - "
    \n", - "
    \n", - "\n", - "
    \n", - "
    Riot (\n", - " clue\n", - " )\n", - "
      \n", - "
    • Avertissement. Cette table ne comportant qu'un seul champ, on peut envisager de la supprimer.
    • \n", - "
    • Le champ clue constitue la clé primaire de la table. C'était déjà un identifiant de l'entité Riot.
    • \n", - "
    \n", - "
    \n", - "\n", - "
    \n", "
    Tuck (\n", - " #wage,\n", + " wage,\n", " #land,\n", " thin\n", " )\n", "
      \n", - "
    • Le champ wage fait partie de la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité Read.
    • \n", + "
    • Le champ wage fait partie de la clé primaire de la table. Sa table d'origine (Read) ayant été supprimée, il n'est pas considéré comme clé étrangère.
    • \n", "
    • Le champ land fait partie de la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité Form.
    • \n", "
    • Le champ thin était déjà un simple attribut de l'association Tuck.
    • \n", "
    \n", "
    \n", - "\n", + "


    NB. Les tables Read et Riot ont été supprimées car elles étaient réduites à la clé primaire de leur entité d'origine. Pour empêcher cette supression, préfixez d'un « + » le nom de l'entité.
    \n", "
    \n", "\n", "" @@ -20561,7 +20004,7 @@ "" ] }, - "execution_count": 139, + "execution_count": 141, "metadata": {}, "output_type": "execute_result" } @@ -20586,17 +20029,17 @@ }, { "cell_type": "code", - "execution_count": 140, + "execution_count": 142, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -20612,7 +20055,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,N\n", "\t\n", @@ -20629,7 +20072,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t1,1\n", "\t\n", @@ -20645,7 +20088,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -20658,7 +20101,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -20671,7 +20114,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -20684,7 +20127,7 @@ "\n", "\n", "\n", - "\n", + "\n", "\t\n", "\t\t\n", "\t\t\n", @@ -20718,7 +20161,7 @@ }, { "cell_type": "code", - "execution_count": 141, + "execution_count": 143, "metadata": {}, "outputs": [ { @@ -20741,33 +20184,13 @@ "
    \n", "
    \n", "
    Army (\n", - " #fail,\n", - " #mere\n", + " fail,\n", + " mere\n", " )\n", "
      \n", "
    • Avertissement. Table résultant de la conversion forcée d'une association DF.
    • \n", - "
    • Le champ fail constitue la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité Busy.
    • \n", - "
    • Le champ mere est une clé étrangère. Il a migré directement de l'entité Cast en perdant son caractère identifiant.
    • \n", - "
    \n", - "
    \n", - "\n", - "
    \n", - "
    Busy (\n", - " fail\n", - " )\n", - "
      \n", - "
    • Avertissement. Cette table ne comportant qu'un seul champ, on peut envisager de la supprimer.
    • \n", - "
    • Le champ fail constitue la clé primaire de la table. C'était déjà un identifiant de l'entité Busy.
    • \n", - "
    \n", - "
    \n", - "\n", - "
    \n", - "
    Cast (\n", - " mere\n", - " )\n", - "
      \n", - "
    • Avertissement. Cette table ne comportant qu'un seul champ, on peut envisager de la supprimer.
    • \n", - "
    • Le champ mere constitue la clé primaire de la table. C'était déjà un identifiant de l'entité Cast.
    • \n", + "
    • Le champ fail constitue la clé primaire de la table. Sa table d'origine (Busy) ayant été supprimée, il n'est pas considéré comme clé étrangère.
    • \n", + "
    • Le champ mere a migré directement de l'entité Cast en perdant son caractère identifiant. La table correspondante ayant été supprimée, il n'est pas considéré comme clé étrangère.
    • \n", "
    \n", "
    \n", "\n", @@ -20784,27 +20207,17 @@ "\n", "
    \n", "
    Poll (\n", - " #mere,\n", + " mere,\n", " #clue,\n", " #book\n", " )\n", "
      \n", - "
    • Le champ mere constitue la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité Cast.
    • \n", + "
    • Le champ mere constitue la clé primaire de la table. Sa table d'origine (Cast) ayant été supprimée, il n'est pas considéré comme clé étrangère.
    • \n", "
    • Le champ clue est une clé étrangère issue de l'entité Hour. Il devrait normalement faire partie de l'identifiant de Poll, mais a été rétrogradé explicitement au rang de simple attribut.
    • \n", "
    • Le champ book est une clé étrangère issue de l'entité Hour. Il devrait normalement faire partie de l'identifiant de Poll, mais a été rétrogradé explicitement au rang de simple attribut.
    • \n", "
    \n", "
    \n", - "\n", - "
    \n", - "
    Riot (\n", - " clue\n", - " )\n", - "
      \n", - "
    • Avertissement. Cette table ne comportant qu'un seul champ, on peut envisager de la supprimer.
    • \n", - "
    • Le champ clue constitue la clé primaire de la table. C'était déjà un identifiant de l'entité Riot.
    • \n", - "
    \n", - "
    \n", - "\n", + "


    NB. Les tables Busy, Cast et Riot ont été supprimées car elles étaient réduites à la clé primaire de leur entité d'origine. Pour empêcher cette supression, préfixez d'un « + » le nom de l'entité.
    \n", "
    \n", "\n", "" @@ -20813,7 +20226,7 @@ "" ] }, - "execution_count": 141, + "execution_count": 143, "metadata": {}, "output_type": "execute_result" } @@ -20870,7 +20283,6 @@ " },\n", " \"column_separator\": \", \",\n", " \"compose_relation\": \"{this_relation_name} ({columns})\",\n", - " \"transform_single_column_relation\": [],\n", " \"transform_forced_relation\": [],\n", " \"transform_relation\": [],\n", " \"relation_sorting_key\": {\n", diff --git a/mocodo/entity.py b/mocodo/entity.py index 04b7d763..7f62d250 100755 --- a/mocodo/entity.py +++ b/mocodo/entity.py @@ -4,6 +4,10 @@ class Entity: def __init__(self, clause): (name, attribute_labels) = clause.split(":", 1) + self.is_deletable = True + if name.startswith("+"): + self.is_deletable = False + name = name[1:] self.name = name.strip().replace("\\", "") self.attribute_labels = outer_split(attribute_labels) self.name_view = self.name[:-1] if self.name[-1].isdigit() else self.name # get rid of single digit suffix, if any diff --git a/mocodo/relations.py b/mocodo/relations.py index 14bcf837..b0780765 100755 --- a/mocodo/relations.py +++ b/mocodo/relations.py @@ -1,5 +1,6 @@ import collections import os +import pprint import re from .file_helpers import write_contents @@ -63,6 +64,7 @@ def may_update_params_with_guessed_title(): self.process_associations() self.process_inheritances() self.delete_inheritance_parent_or_children_to_delete() + self.delete_deletable_relations() self.make_primary_keys_first() self.may_disambiguate_with_leg_notes = set_disambiguation_strategy(params["disambiguation"]) may_update_params_with_guessed_title() @@ -101,7 +103,9 @@ def set_defaults(template): }, "column_separator": ", ", "compose_relation": "{this_relation_name} ({columns})", - "transform_single_column_relation": [], + "deleted_relation_separator": "", + "compose_deleted_relation": "", + "compose_deleted_relations": "", "transform_forced_relation": [], "transform_relation": [], "relation_separator": "\n", @@ -135,6 +139,14 @@ def set_defaults(template): result.setdefault("compose_strengthening_primary_key", result["compose_primary_foreign_key"]) result.setdefault("compose_unsourced_foreign_key", result["compose_normal_attribute"]) result.setdefault("compose_unsourced_primary_foreign_key", result["compose_primary_key"]) + result.setdefault("compose_naturalized_foreign_key", result["compose_normal_attribute"]) + result.setdefault("compose_primary_naturalized_foreign_key", result["compose_primary_key"]) + result.setdefault("compose_deleted_child_naturalized_foreign_key", result["compose_normal_attribute"]) + result.setdefault("compose_deleted_parent_naturalized_foreign_key", result["compose_normal_attribute"]) + result.setdefault("compose_demoted_naturalized_foreign_key", result["compose_normal_attribute"]) + result.setdefault("compose_stopped_naturalized_foreign_key", result["compose_normal_attribute"]) + result.setdefault("compose_unsourced_naturalized_foreign_key", result["compose_normal_attribute"]) + result.setdefault("compose_unsourced_primary_naturalized_foreign_key", result["compose_primary_key"]) return result template = set_defaults(template) @@ -193,8 +205,6 @@ def make_labels_from_raw_labels(): data["sorted_columns"] = template["column_separator"].join(sorted(fields, key=lambda field: extract_sorting_key(field, "column_sorting_key"))) data["columns"] = template["column_separator"].join(fields) line = template["compose_relation"].format(**data) - if len(relation["columns"]) == 1: - line = transform(line, "transform_single_column_relation") if relation["is_forced"]: line = transform(line, "transform_forced_relation") line = transform(line, "transform_relation") @@ -225,6 +235,16 @@ def make_labels_from_raw_labels(): lines.pop() data["relations"] = template["relation_separator"].join(lines) data["sorted_relations"] = template["relation_separator"].join(sorted(lines, key=lambda line: extract_sorting_key(line, "relation_sorting_key"))) + + if self.deleted_relations: + lines = [] + for deleted_relation in self.deleted_relations: + lines.append(template["compose_deleted_relation"].format(this_relation_name=deleted_relation)) + deleted_relation_lines = template["deleted_relation_separator"].join(lines) + data["deleted_relations"] = template["compose_deleted_relations"].format(deleted_relation_lines=deleted_relation_lines) + else: + data["deleted_relations"] = "" + data["relations"] = template["compose_relational_schema"].format(**data) result = transform(data["relations"], "transform_relational_schema") return result @@ -260,6 +280,7 @@ def relations_from_entities(self): self.relations[name] = { "this_relation_name": entity.name, "is_forced": False, + "is_deletable": entity.is_deletable, "columns": [] } for attribute in entity.attributes: @@ -568,17 +589,19 @@ def delete_inheritance_parent_or_children_to_delete(self): for entity_to_delete in self.inheritance_parent_or_children_to_delete: del self.relations[entity_to_delete] - - + def delete_deletable_relations(self): + deleted_outer_sources = set() + for (name, relation) in list(self.relations.items()): + if relation.get("is_deletable") and all(column["nature"] == "primary_key" for column in relation["columns"]): + del self.relations[name] + deleted_outer_sources.add(name) + for relation in self.relations.values(): + for column in relation["columns"]: + if column["outer_source"] in deleted_outer_sources: + column["nature"] = column["nature"].replace("foreign", "naturalized_foreign") + self.deleted_relations = sorted(deleted_outer_sources) def make_primary_keys_first(self): for relation in self.relations.values(): relation["columns"].sort(key=lambda column: not column["primary"]) - - -if __name__=="__main__": - import sys - sys.path.append("/Users/aristide/Dropbox/Sites/mocodo_online/mocodo") - from .mocodo import main - main() diff --git a/mocodo/resources/relation_templates/diagram.json b/mocodo/resources/relation_templates/diagram.json index dedc4eae..e88d256d 100644 --- a/mocodo/resources/relation_templates/diagram.json +++ b/mocodo/resources/relation_templates/diagram.json @@ -2,16 +2,10 @@ "extension": ".mld", "highlight": "plain", "compose_primary_key": "_{label}", - "compose_foreign_key": "#{label}->{outer_source}->{raw_label}", + "compose_foreign_key": "#{label}->{outer_source}->{raw_label}", "compose_outer_attribute": "{label}", - "compose_primary_foreign_key": "_#{label}->{outer_source}->{raw_label}", + "compose_primary_foreign_key": "_#{label}->{outer_source}->{raw_label}", "compose_relation": "{this_relation_name}: {columns}", - "transform_single_column_relation": [ - { - "search": "(?s)(.+:) .+", - "replace": "\\1" - } - ], "transform_relation": [ { "comment": "By default, the first attribute is an identifier", @@ -21,24 +15,6 @@ ], "compose_relational_schema": "%%mocodo\n{relations}", "transform_relational_schema": [ - { - "search": "(?sm)#([^,\n]+)->(.+?)->.+?(?=[,\n])(.+?^\\2:)", - "replace": "\\1\\3", - "iterated": true - }, - { - "search": "(?sm)(^(.+?):.+?)#([^,\n]+)->\\2->(.+?)(?=[,\n])", - "replace": "\\1\\3", - "iterated": true - }, - { - "search": "(?m)^.+?\n?", - "replace": "" - }, - { - "search": "", - "replace": "" - }, { "search": "(?m)^:\n(?=:)", "replace": ":" diff --git a/mocodo/resources/relation_templates/html.json b/mocodo/resources/relation_templates/html.json index 6fa41d31..2246d7dc 100644 --- a/mocodo/resources/relation_templates/html.json +++ b/mocodo/resources/relation_templates/html.json @@ -35,11 +35,5 @@ "compose_primary_foreign_key": "#{label}", "column_separator": ",\n ", "compose_relation": "
    \n {this_relation_name} (\n {columns}\n )\n
    ", - "transform_single_column_relation": [ - { - "search": "(?s)(.+)", - "replace": "" - } - ], "compose_relational_schema": "\n\n\n\n\n\n
    \n{relations}\n
    \n\n" } \ No newline at end of file diff --git a/mocodo/resources/relation_templates/html_verbose.json b/mocodo/resources/relation_templates/html_verbose.json index b02c6665..5221d3de 100644 --- a/mocodo/resources/relation_templates/html_verbose.json +++ b/mocodo/resources/relation_templates/html_verbose.json @@ -55,14 +55,18 @@ "compose_strengthening_primary_key": "#{label}Le champ {label} fait partie de la clé primaire de la table. Il a migré à partir de l'entité {outer_source} pour renforcer l'identifiant.", "compose_unsourced_foreign_key": "{label}Le champ {label} a migré par l'association de dépendance fonctionnelle {association_name} à partir de l'entité {adjacent_source} (supprimée). Attention : aucune contrainte d'intégrité référentielle n'est plus assurée.", "compose_unsourced_primary_foreign_key": "{label}Le champ {label} fait partie de la clé primaire de la table. Il a migré par l'association de dépendance fonctionnelle {association_name} à partir de l'entité {adjacent_source} (supprimée). Attention : aucune contrainte d'intégrité référentielle n'est plus assurée.", + "compose_deleted_child_naturalized_foreign_key": "{label}Le champ {label} a migré à travers l'entité-fille {adjacent_source} (supprimée) dans laquelle il avait déjà migré à partir de l'entité {outer_source} (également supprimée).", + "compose_deleted_parent_naturalized_foreign_key": "{label}Le champ {label} a migré à travers l'entité-mère {adjacent_source} (supprimée), et réfère maintenant directement à l'entité {outer_source}.", + "compose_demoted_naturalized_foreign_key": "{label}Le champ {label} est un simple attribut. Sa table d'origine, {outer_source}, ayant été supprimée, il n'est pas considéré comme clé étrangère. Il devrait normalement faire partie de l'identifiant de {this_relation_name}, mais a été rétrogradé explicitement au rang de simple attribut.", + "compose_naturalized_foreign_key": "{label}Le champ {label} a migré par l'association de dépendance fonctionnelle {association_name} à partir de l'entité {outer_source} en perdant son caractère identifiant. De plus, comme la table créée à partir de cette entité a été supprimée, il n'est pas considéré comme clé étrangère.", + "compose_primary_naturalized_foreign_key": "{label}Le champ {label} fait partie de la clé primaire de la table. Sa table d'origine ({outer_source}) ayant été supprimée, il n'est pas considéré comme clé étrangère.", + "compose_stopped_naturalized_foreign_key": "{label}Le champ {label} a migré directement de l'entité {outer_source} en perdant son caractère identifiant. La table correspondante ayant été supprimée, il n'est pas considéré comme clé étrangère.", + "compose_unsourced_naturalized_foreign_key": "{label}Le champ {label} a migré par l'association de dépendance fonctionnelle {association_name} à partir de l'entité {adjacent_source} (supprimée). Attention : aucune contrainte d'intégrité référentielle n'est plus assurée.", + "compose_unsourced_primary_naturalized_foreign_key": "{label}Le champ {label} fait partie de la clé primaire de la table. Il a migré par l'association de dépendance fonctionnelle {association_name} à partir de l'entité {adjacent_source} (supprimée). Attention : aucune contrainte d'intégrité référentielle n'est plus assurée.", "column_separator": ",\n ", "compose_relation": "
    \n
    {this_relation_name} (\n {columns}\n )\n
    ", - "transform_single_column_relation": [ - { - "search": "(?s)(.+)$", - "replace": "\\1\n
  • Avertissement. Cette table ne comportant qu'un seul champ, on peut envisager de la supprimer.
  • " - } - ], + "compose_deleted_relation": "La table {this_relation_name} a été supprimée car elle était réduite à la clé primaire de son entité d'origine. Pour empêcher cette supression, préfixez d'un « + » le nom de l'entité.", + "compose_deleted_relations": "


    NB. {deleted_relation_lines}
    ", "transform_forced_relation": [ { "search": "(?s)(.+)$", @@ -93,6 +97,15 @@ "search": "
  • Le champ (.+), (.+?) est une clé étrangère\\. Il a (migré à partir de l'entité .+? par l'association de dépendance fonctionnelle .+? en perdant) son (caractère identifiant.)", "replace": "
  • Les champs \\1 et \\2 sont des clés étrangères. Ils ont \\3 leur \\4" }, + { + "search": "(
  • Le champ )(.+?)( fait partie de la clé primaire de la table. Sa table d'origine .+?)\n\\1(.+?)\\3", + "replace": "\\1\\2, \\4\\3", + "iterated": true + }, + { + "search": "
  • Le champ (.+), (.+?) fait partie de la clé primaire de la table. Sa table d'origine (.+?) ayant été supprimée, il n'est pas considéré comme clé étrangère.", + "replace": "
  • Les champs \\1 et \\2 font partie de la clé primaire de la table. Leur table d'origine \\3 ayant été supprimée, ils ne sont pas considérés comme clés étrangères." + }, { "search": "(
  • Le champ )(.+?)( fait partie de la clé primaire de la table.+?)\n\\1(.+?)\\3", "replace": "\\1\\2, \\4\\3", @@ -140,8 +153,17 @@ "replace": "\n" } ], - "compose_relational_schema": "\n\n\n\n\n\n
    \n{relations}\n
    \n\n", + "compose_relational_schema": "\n\n\n\n\n\n
    \n{relations}{deleted_relations}\n
    \n\n", "transform_relational_schema": [ + { + "search": "(La table )(.+?)( a été supprimée .+)\\1(.+?)\\3", + "replace": "\\1\\2, \\4\\3", + "iterated": true + }, + { + "search": "La table (.+), (.+?) a été supprimée .+", + "replace": "Les tables \\1 et \\2 ont été supprimées car elles étaient réduites à la clé primaire de leur entité d'origine. Pour empêcher cette supression, préfixez d'un « + » le nom de l'entité." + }, { "search": "\\s+$", "replace": "" diff --git a/mocodo/resources/relation_templates/json.json b/mocodo/resources/relation_templates/json.json index 019238df..fe5ecaca 100644 --- a/mocodo/resources/relation_templates/json.json +++ b/mocodo/resources/relation_templates/json.json @@ -8,7 +8,10 @@ "column_separator": ",\n ", "compose_relation": "{{\n \"this_relation_name\": \"{this_relation_name}\",\n \"this_relation_name_lowercase\": \"{this_relation_name_lowercase}\",\n \"this_relation_name_uppercase\": \"{this_relation_name_uppercase}\",\n \"this_relation_name_titlecase\": \"{this_relation_name_titlecase}\",\n \"is_forced\": \"{is_forced}\",\n \"columns\": [\n {columns}\n ]\n }}", "relation_separator": ",\n ", - "compose_relational_schema": "{{\n \"title\": \"{title}\",\n \"title_lowercase\": \"{title_lowercase}\",\n \"title_uppercase\": \"{title_uppercase}\",\n \"title_titlecase\": \"{title_titlecase}\",\n \"relations\": [\n {relations}\n ]\n}}", + "compose_deleted_relation": "\"{this_relation_name}\"", + "deleted_relation_separator": ", ", + "compose_deleted_relations": ",\n \"deleted_relations\": [{deleted_relation_lines}]", + "compose_relational_schema": "{{\n \"title\": \"{title}\",\n \"title_lowercase\": \"{title_lowercase}\",\n \"title_uppercase\": \"{title_uppercase}\",\n \"title_titlecase\": \"{title_titlecase}\"{deleted_relations},\n \"relations\": [\n {relations}\n ]\n}}", "transform_relational_schema": [ { "search": "MOCODO_REPLACE_True", diff --git a/mocodo/resources/relation_templates/latex.json b/mocodo/resources/relation_templates/latex.json index 91a48094..9adb4af1 100644 --- a/mocodo/resources/relation_templates/latex.json +++ b/mocodo/resources/relation_templates/latex.json @@ -26,11 +26,5 @@ "compose_foreign_key": "\\foreign{{{label}}}", "compose_primary_foreign_key": "\\foreign{{\\prim{{{label}}}}}", "compose_relation": " {this_relation_name_titlecase} & ({columns})\\\\", - "transform_single_column_relation": [ - { - "search": " (.+)", - "replace": "% \\1" - } - ], "compose_relational_schema": "% Copy this before \\begin{{document}}\n\n\\usepackage[normalem]{{ulem}}\n\\newenvironment{{mld}}\n {{\\par\\begin{{minipage}}{{\\linewidth}}\\begin{{tabular}}{{rp{{0.7\\linewidth}}}}}}\n {{\\end{{tabular}}\\end{{minipage}}\\par}}\n\\newcommand{{\\relat}}[1]{{\\textsc{{#1}}}}\n\\newcommand{{\\attr}}[1]{{\\emph{{#1}}}}\n\\newcommand{{\\prim}}[1]{{\\uline{{#1}}}}\n\\newcommand{{\\foreign}}[1]{{\\#\\textsl{{#1}}}}\n\n% Copy that after \\begin{{document}}\n\n\\begin{{mld}}\n{relations}\n\\end{{mld}}" } \ No newline at end of file diff --git a/mocodo/resources/relation_templates/markdown.json b/mocodo/resources/relation_templates/markdown.json index e2430f20..7fc9f91e 100644 --- a/mocodo/resources/relation_templates/markdown.json +++ b/mocodo/resources/relation_templates/markdown.json @@ -5,12 +5,6 @@ "compose_foreign_key": "_#{label}_", "compose_primary_foreign_key": "_#{label}_", "compose_relation": "**{this_relation_name}** ({columns})", - "transform_single_column_relation": [ - { - "search": "(?s)(.+)", - "replace": "" - } - ], "relation_separator": "
    \n", "transform_relational_schema": [ { diff --git a/mocodo/resources/relation_templates/markdown_verbose.json b/mocodo/resources/relation_templates/markdown_verbose.json index fb3b15b3..fe2534df 100644 --- a/mocodo/resources/relation_templates/markdown_verbose.json +++ b/mocodo/resources/relation_templates/markdown_verbose.json @@ -27,13 +27,18 @@ "compose_strengthening_primary_key": "_#{label}_Le champ _{label}_ fait partie de la clé primaire de la table. Il a migré à partir de l'entité _{outer_source}_ pour renforcer l'identifiant.", "compose_unsourced_foreign_key": "{label}Le champ _{label}_ a migré par l'association de dépendance fonctionnelle _{association_name}_ à partir de l'entité _{adjacent_source}_ (supprimée). **Attention** : aucune contrainte d'intégrité référentielle n'est plus assurée.", "compose_unsourced_primary_foreign_key": "{label}Le champ _{label}_ fait partie de la clé primaire de la table. Il a migré par l'association de dépendance fonctionnelle _{association_name}_ à partir de l'entité _{adjacent_source}_ (supprimée). **Attention** : aucune contrainte d'intégrité référentielle n'est plus assurée.", + "compose_deleted_child_naturalized_foreign_key": "_#{label}_Le champ _{label}_ a migré à travers l'entité-fille _{adjacent_source}_ (supprimée) dans laquelle il avait déjà migré à partir de l'entité _{outer_source}_ (également supprimée).", + "compose_deleted_parent_naturalized_foreign_key": "_#{label}_Le champ _{label}_ a migré à travers l'entité-mère _{adjacent_source}_ (supprimée) dans laquelle il avait déjà migré à partir de l'entité _{outer_source}_ (également supprimée).", + "compose_demoted_naturalized_foreign_key": "_#{label}_Le champ _{label}_ est un simple attribut. Sa table d'origine, _{outer_source}_, ayant été supprimée, il n'est pas considéré comme clé étrangère. Il devrait normalement faire partie de l'identifiant de _{this_relation_name}_, mais a été rétrogradé explicitement au rang de simple attribut.", + "compose_naturalized_foreign_key": "_#{label}_Le champ _{label}_ a migré par l'association de dépendance fonctionnelle _{association_name}_ à partir de l'entité _{outer_source}_ en perdant son caractère identifiant. De plus, comme la table créée à partir de cette entité a été supprimée, il n'est pas considéré comme clé étrangère.", + "compose_primary_naturalized_foreign_key": "_#{label}_Le champ _{label}_ fait partie de la clé primaire de la table. Sa table d'origine (_{outer_source}_) ayant été supprimée, il n'est pas considéré comme clé étrangère.", + "compose_stopped_naturalized_foreign_key": "_#{label}_Le champ _{label}_ a migré directement de l'entité _{outer_source}_ en perdant son caractère identifiant. La table correspondante ayant été supprimée, il n'est pas considéré comme clé étrangère.", + "compose_unsourced_naturalized_foreign_key": "{label}Le champ _{label}_ a migré par l'association de dépendance fonctionnelle _{association_name}_ à partir de l'entité _{adjacent_source}_ (supprimée). **Attention** : aucune contrainte d'intégrité référentielle n'est plus assurée.", + "compose_unsourced_primary_naturalized_foreign_key": "{label}Le champ _{label}_ fait partie de la clé primaire de la table. Il a migré par l'association de dépendance fonctionnelle _{association_name}_ à partir de l'entité _{adjacent_source}_ (supprimée). **Attention** : aucune contrainte d'intégrité référentielle n'est plus assurée.", "compose_relation": "**{this_relation_name}** ({columns}) ", - "transform_single_column_relation": [ - { - "search": "(?s)(.+)$", - "replace": "\\1\n- **Avertissement.** Cette table ne comportant qu'un seul champ, on peut envisager de la supprimer." - } - ], + "compose_deleted_relation": "La table _{this_relation_name}_ a été supprimée car elle était réduite à la clé primaire de son entité d'origine. Pour empêcher cette supression, préfixez d'un « + » le nom de l'entité.", + "compose_deleted_relations": "\n---\n\n**NB.** {deleted_relation_lines}", + "compose_relational_schema": "{relations}{deleted_relations}", "transform_forced_relation": [ { "search": "(?s)(.+)$", @@ -41,77 +46,95 @@ } ], "transform_relation": [ - { - "search": "(?s)(.+?)(.+)", - "replace": "\\2\n- \\1 ", - "iterated": true + { + "search": "(?s)(.+?)(.+)", + "replace": "\\2\n- \\1 ", + "iterated": true + }, + { + "search": "(- Le champ )(.+?)( était déjà un simple attribut de .+?.)\n\\1(.+?)\\3", + "replace": "\\1\\2, \\4\\3", + "iterated": true + }, + { + "search": "- Le champ (.+), (.+?) était déjà un simple attribut( de .+?.)", + "replace": "- Les champs \\1 et \\2 étaient déjà de simples attributs\\3" + }, + { + "search": "(- Le champ )(.+?)( est une clé étrangère\\. Il a migré à partir de l'entité .+? par l'association de dépendance fonctionnelle .+? en perdant son caractère identifiant.)\n\\1(.+?)\\3", + "replace": "\\1\\2, \\4\\3", + "iterated": true }, { - "search": "(- Le champ )(.+?)( était déjà un simple attribut de .+)\n\\1(.+?)\\3", - "replace": "\\1\\2, \\4\\3", - "iterated": true + "search": "- Le champ (.+), (.+?) est une clé étrangère\\. Il a (migré à partir de l'entité .+? par l'association de dépendance fonctionnelle .+? en perdant) son (caractère identifiant.)", + "replace": "- Les champs \\1 et \\2 sont des clés étrangères. Ils ont \\3 leur \\4" }, { - "search": "- Le champ (.+), (.+?) était déjà un simple attribut( de .+)", - "replace": "- Les champs \\1 et \\2 étaient déjà de simples attributs\\3" + "search": "(- Le champ )(.+?)( fait partie de la clé primaire de la table. Sa table d'origine .+?)\n\\1(.+?)\\3", + "replace": "\\1\\2, \\4\\3", + "iterated": true }, { - "search": "(- Le champ )(.+?)( est une clé étrangère\\. Il a .+)\n\\1(.+?)\\3", - "replace": "\\1\\2, \\4\\3", - "iterated": true + "search": "- Le champ (.+), (.+?) fait partie de la clé primaire de la table. Sa table d'origine (.+?) ayant été supprimée, il n'est pas considéré comme clé étrangère.", + "replace": "- Les champs \\1 et \\2 font partie de la clé primaire de la table. Leur table d'origine \\3 ayant été supprimée, ils ne sont pas considérés comme clés étrangères." }, { - "search": "- Le champ (.+), (.+?) est une clé étrangère\\. Il a (migré .+ en perdant) son (caractère identifiant\\.)", - "replace": "- Les champs \\1 et \\2 sont des clés étrangères. Ils ont \\3 leur \\4" + "search": "(- Le champ )(.+?)( fait partie de la clé primaire de la table.+?)\n\\1(.+?)\\3", + "replace": "\\1\\2, \\4\\3", + "iterated": true }, { - "search": "(- Le champ )(.+?)( fait partie de la clé primaire de la table.+?)\n\\1(.+?)\\3", - "replace": "\\1\\2, \\4\\3", - "iterated": true + "search": "- Le champ (.+), (.+?) fait partie de la clé primaire de la table. C'est une clé étrangère qui a (migré directement à partir de l'entité .+?)", + "replace": "- Les champs \\1 et \\2 font partie de la clé primaire de la table. Ce sont des clés étrangères qui ont \\3" }, { - "search": "- Le champ (.+), (.+?) fait partie de la clé primaire de la table. C'est une clé étrangère qui a (migré directement à partir de l'entité .+?)", - "replace": "- Les champs \\1 et \\2 font partie de la clé primaire de la table. Ce sont des clés étrangères qui ont \\3" + "search": "- Le champ (.+), (.+?) fait partie de la clé primaire de la table. C'était déjà un identifiant (de l'entité .+?)", + "replace": "- Les champs \\1 et \\2 font partie de la clé primaire de la table. C'était déjà des identifiants \\3" }, { - "search": "- Le champ (.+), (.+?) fait partie de la clé primaire de la table. C'est une clé étrangère qui a (migré directement à partir de l'entité-mère .+?)", - "replace": "- Les champs \\1 et \\2 font partie de la clé primaire de la table. Ce sont des clés étrangères qui ont \\3" + "search": "- Le champ (.+), (.+?) fait partie de la clé primaire de la table. Il a (migré .+?)", + "replace": "- Les champs \\1 et \\2 font partie de la clé primaire de la table. Ils ont \\3" }, { - "search": "- Le champ (.+), (.+?) fait partie de la clé primaire de la table. C'était déjà un identifiant (de l'entité .+?)", - "replace": "- Les champs \\1 et \\2 font partie de la clé primaire de la table. C'était déjà des identifiants \\3" + "search": "$", + "replace": "" }, { - "search": "- Le champ (.+), (.+?) fait partie de la clé primaire de la table. Il a (migré .+?)", - "replace": "- Les champs \\1 et \\2 font partie de la clé primaire de la table. Ils ont \\3" + "search": "(?s)(.+)", + "replace": "\\1I", + "iterated": true }, { - "search": "$", - "replace": "" + "search": "(?s)fait partie de( la clé primaire de la table.+)I", + "replace": "constitue\\1" }, { - "search": "(?s)(.+)", - "replace": "\\1I", - "iterated": true + "search": "(?s)font partie de( la clé primaire de la table.+)I", + "replace": "constituent\\1" }, { - "search": "(?s)fait partie de( la clé primaire de la table.+)I", - "replace": "constitue\\1" + "search": "I+", + "replace": "" }, { - "search": "(?s)font partie de( la clé primaire de la table.+)I", - "replace": "constituent\\1" + "search": "(?s)
  • (\n- .+)", + "replace": "
      \\1\n
    \n
    " }, { - "search": "I+", - "replace": "" + "search": "$", + "replace": "\n" + } + ], + "transform_relational_schema": [ + { + "search": "(La table )(.+?)( a été supprimée .+)\\1(.+?)\\3", + "replace": "\\1\\2, \\4\\3", + "iterated": true }, { - "search": "$", - "replace": "\n" - } - ], - "transform_relational_schema": [ + "search": "La table (.+), (.+?) a été supprimée .+", + "replace": "Les tables \\1 et \\2 ont été supprimées car elles étaient réduites à la clé primaire de leur entité d'origine. Pour empêcher cette supression, préfixez d'un « + » le nom de l'entité." + }, { "search": "\\s+$", "replace": "" diff --git a/mocodo/resources/relation_templates/mysql.json b/mocodo/resources/relation_templates/mysql.json index f89e969e..b6c017b1 100644 --- a/mocodo/resources/relation_templates/mysql.json +++ b/mocodo/resources/relation_templates/mysql.json @@ -38,12 +38,6 @@ "compose_primary_foreign_key": "`{label_lowercase}` {data_type},\nADD_PRIMARY_KEY `{label_lowercase}`,\nADD_FOREIGN_KEY (`{label_lowercase}`) REFERENCES `{outer_source_uppercase}` (`{raw_label_lowercase}`)", "column_separator": ",\n ", "compose_relation": "CREATE TABLE `{this_relation_name_uppercase}` (\n {columns},\n PRIMARY KEY (),\n) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4;", - "transform_single_column_relation": [ - { - "search": "(?s)(.+)", - "replace": "/*\n\\1\n*/" - } - ], "transform_relation": [ { "comment": "Replace the missing data types with an arbitrary default.", diff --git a/mocodo/resources/relation_templates/oracle.json b/mocodo/resources/relation_templates/oracle.json index 503d1bc9..ccd16ee0 100644 --- a/mocodo/resources/relation_templates/oracle.json +++ b/mocodo/resources/relation_templates/oracle.json @@ -38,12 +38,6 @@ "compose_primary_foreign_key": "\"{label_lowercase}\" {data_type},\nADD_PRIMARY_KEY \"{label_lowercase}\",\nADD_FOREIGN_KEY (\"{label_lowercase}\") REFERENCES \"{outer_source_uppercase}\" (\"{raw_label_lowercase}\")", "column_separator": ",\n ", "compose_relation": "CREATE TABLE \"{this_relation_name_uppercase}\" (\n {columns},\n PRIMARY KEY (),\n);", - "transform_single_column_relation": [ - { - "search": "(?s)(.+)", - "replace": "/*\n\\1\n*/" - } - ], "transform_relation": [ { "comment": "Replace the missing data types with an arbitrary default.", diff --git a/mocodo/resources/relation_templates/postgresql.json b/mocodo/resources/relation_templates/postgresql.json index fde94ba3..3fc056ff 100644 --- a/mocodo/resources/relation_templates/postgresql.json +++ b/mocodo/resources/relation_templates/postgresql.json @@ -38,12 +38,6 @@ "compose_primary_foreign_key": "{label_lowercase} {data_type},\nADD_PRIMARY_KEY {label_lowercase},\nADD_FOREIGN_KEY ({label_lowercase}) REFERENCES {outer_source_uppercase} ({raw_label_lowercase})", "column_separator": ",\n ", "compose_relation": "CREATE TABLE {this_relation_name_uppercase} (\n {columns},\n PRIMARY KEY (),\n);", - "transform_single_column_relation": [ - { - "search": "(?s)(.+)", - "replace": "/*\n\\1\n*/" - } - ], "transform_relation": [ { "comment": "Replace the missing data types with an arbitrary default.", diff --git a/mocodo/resources/relation_templates/sqlite.json b/mocodo/resources/relation_templates/sqlite.json index 10bca663..4d75c949 100644 --- a/mocodo/resources/relation_templates/sqlite.json +++ b/mocodo/resources/relation_templates/sqlite.json @@ -38,12 +38,6 @@ "compose_primary_foreign_key": "\"{label_lowercase}\" {data_type},\nADD_PRIMARY_KEY \"{label_lowercase}\",\nADD_FOREIGN_KEY (\"{label_lowercase}\") REFERENCES \"{outer_source_uppercase}\" (\"{raw_label_lowercase}\")", "column_separator": ",\n ", "compose_relation": "CREATE TABLE \"{this_relation_name_uppercase}\" (\n {columns},\n PRIMARY KEY (),\n);", - "transform_single_column_relation": [ - { - "search": "(?s)(.+)", - "replace": "/*\n\\1\n*/" - } - ], "transform_relation": [ { "comment": "Replace the missing data types with an arbitrary default.", diff --git a/mocodo/resources/relation_templates/txt2tags.json b/mocodo/resources/relation_templates/txt2tags.json index 7c0a16ea..7fd46485 100644 --- a/mocodo/resources/relation_templates/txt2tags.json +++ b/mocodo/resources/relation_templates/txt2tags.json @@ -5,11 +5,5 @@ "compose_foreign_key": "#{label}", "compose_primary_foreign_key": "__#{label}__", "compose_relation": "- **{this_relation_name}** ({columns})", - "transform_single_column_relation": [ - { - "search": "(.+)", - "replace": "%% \\1" - } - ], "compose_relational_schema": "{title}\nGénéré par Mocodo\n%%mtime(%c)\n%!encoding: utf8\n{relations}" } \ No newline at end of file diff --git a/test/snapshots/snapshot.md b/test/snapshots/snapshot.md index 7a029f3e..5fea7a41 100644 --- a/test/snapshots/snapshot.md +++ b/test/snapshots/snapshot.md @@ -49,16 +49,11 @@ ESPÈCE: code espèce, libellé ::: -:: -OCCUPE: #code espèce->ANIMAL->code espèce, _#nom->ANIMAL->nom, _num. enclos, #date début->PÉRIODE->date début, #date fin->PÉRIODE->date fin +::: +OCCUPE: #code espèce->ANIMAL->code espèce, _#nom->ANIMAL->nom, _num. enclos, date début, date fin : ANIMAL: #code espèce->ESPÈCE->code espèce, _nom, sexe, date naissance, date décès, #code espèce mère->ANIMAL->code espèce, #nom mère->ANIMAL->nom, type alimentation, CARNIVORE, quantité viande, HERBIVORE, plante préférée : - - -::: -PÉRIODE: date début, _date fin -::: ``` ### `debug.json` @@ -78,22 +73,19 @@ PÉRIODE: date début, _date fin | ANIMAL | quantité viande | `deleted_child_attribute` | CARNIVORE | None | | ANIMAL | HERBIVORE | `deleted_child_entity_name` | HERBIVORE | HERBIVORE | | ANIMAL | plante préférée | `deleted_child_attribute` | HERBIVORE | None | -| ENCLOS | num. enclos | `primary_key` | None | None | | ESPÈCE | code espèce | `primary_key` | None | None | | ESPÈCE | libellé | `normal_attribute` | None | None | | OCCUPE | code espèce | `primary_foreign_key` | ANIMAL | ANIMAL | | OCCUPE | nom | `primary_foreign_key` | ANIMAL | ANIMAL | -| OCCUPE | num. enclos | `primary_foreign_key` | ENCLOS | ENCLOS | -| OCCUPE | date début | `demoted_foreign_key` | PÉRIODE | PÉRIODE | -| OCCUPE | date fin | `demoted_foreign_key` | PÉRIODE | PÉRIODE | +| OCCUPE | num. enclos | `primary_key` | ENCLOS | ENCLOS | +| OCCUPE | date début | `normal_attribute` | PÉRIODE | PÉRIODE | +| OCCUPE | date fin | `normal_attribute` | PÉRIODE | PÉRIODE | | PEUT COHABITER AVEC | code espèce | `primary_foreign_key` | ESPÈCE | ESPÈCE | | PEUT COHABITER AVEC | code espèce commensale | `primary_foreign_key` | ESPÈCE | ESPÈCE | | PEUT COHABITER AVEC | nb. max. commensaux | `association_attribute` | None | None | | PEUT VIVRE DANS | code espèce | `primary_foreign_key` | ESPÈCE | ESPÈCE | -| PEUT VIVRE DANS | num. enclos | `primary_foreign_key` | ENCLOS | ENCLOS | +| PEUT VIVRE DANS | num. enclos | `primary_key` | ENCLOS | ENCLOS | | PEUT VIVRE DANS | nb. max. congénères | `association_attribute` | None | None | -| PÉRIODE | date début | `primary_key` | None | None | -| PÉRIODE | date fin | `primary_key` | None | None | ``` ### `mysql.json` @@ -118,13 +110,6 @@ CREATE TABLE `ANIMAL` ( PRIMARY KEY (`code_espèce`, `nom`) ) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4; -/* -CREATE TABLE `ENCLOS` ( - `num_enclos` VARCHAR(42), - PRIMARY KEY (`num_enclos`) -) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4; -*/ - CREATE TABLE `ESPÈCE` ( `code_espèce` VARCHAR(42), `libellé` VARCHAR(42), @@ -154,20 +139,11 @@ CREATE TABLE `PEUT_VIVRE_DANS` ( PRIMARY KEY (`code_espèce`, `num_enclos`) ) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4; -CREATE TABLE `PÉRIODE` ( - `date_début` VARCHAR(42), - `date_fin` VARCHAR(42), - PRIMARY KEY (`date_début`, `date_fin`) -) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4; - ALTER TABLE `ANIMAL` ADD FOREIGN KEY (`code_espèce mère`, `nom mère`) REFERENCES `ANIMAL` (`code_espèce`, `nom`); ALTER TABLE `ANIMAL` ADD FOREIGN KEY (`code_espèce`) REFERENCES `ESPÈCE` (`code_espèce`); -ALTER TABLE `OCCUPE` ADD FOREIGN KEY (`date_début`, `date_fin`) REFERENCES `PÉRIODE` (`date_début`, `date_fin`); --- ALTER TABLE `OCCUPE` ADD FOREIGN KEY (`num_enclos`) REFERENCES `ENCLOS` (`num_enclos`); ALTER TABLE `OCCUPE` ADD FOREIGN KEY (`code_espèce`, `nom`) REFERENCES `ANIMAL` (`code_espèce`, `nom`); ALTER TABLE `PEUT_COHABITER_AVEC` ADD FOREIGN KEY (`code_espèce commensale`) REFERENCES `ESPÈCE` (`code_espèce`); ALTER TABLE `PEUT_COHABITER_AVEC` ADD FOREIGN KEY (`code_espèce`) REFERENCES `ESPÈCE` (`code_espèce`); --- ALTER TABLE `PEUT_VIVRE_DANS` ADD FOREIGN KEY (`num_enclos`) REFERENCES `ENCLOS` (`num_enclos`); ALTER TABLE `PEUT_VIVRE_DANS` ADD FOREIGN KEY (`code_espèce`) REFERENCES `ESPÈCE` (`code_espèce`); ``` @@ -175,14 +151,10 @@ ALTER TABLE `PEUT_VIVRE_DANS` ADD FOREIGN KEY (`code_espèce`) REFERENCES `ESPÈ ```markdown **ANIMAL** (_#code espèce_, nom, sexe, date naissance, date décès, _#code espèce mère_, _#nom mère_, type alimentation, CARNIVORE, quantité viande, HERBIVORE, plante préférée)
    - **ESPÈCE** (code espèce, libellé)
    -**OCCUPE** (_#code espèce_, _#nom_, _#num. enclos_, _#date début_, _#date fin_)
    +**OCCUPE** (_#code espèce_, _#nom_, num. enclos, date début, date fin)
    **PEUT COHABITER AVEC** (_#code espèce_, _#code espèce commensale_, nb. max. commensaux)
    -**PEUT VIVRE DANS** (_#code espèce_, _#num. enclos_, nb. max. congénères)
    -**PÉRIODE** (date début, date fin) +**PEUT VIVRE DANS** (_#code espèce_, num. enclos, nb. max. congénères) ``` ### `markdown_verbose.json` @@ -192,26 +164,23 @@ ALTER TABLE `PEUT_VIVRE_DANS` ADD FOREIGN KEY (`code_espèce`) REFERENCES `ESPÈ - Le champ _code espèce_ fait partie de la clé primaire de la table. Il a migré à partir de l'entité _ESPÈCE_ pour renforcer l'identifiant. - Le champ _nom_ fait partie de la clé primaire de la table. C'était déjà un identifiant de l'entité _ANIMAL_. - Les champs _sexe_, _date naissance_ et _date décès_ étaient déjà de simples attributs de l'entité _ANIMAL_. -- Les champs _code espèce mère_ et _nom mère_ sont des clés étrangères. Ils ont migré par l'association de dépendance fonctionnelle _A MÈRE_ à partir de l'entité _ANIMAL_ en perdant leur caractère identifiant. +- Le champ _code espèce mère_ est une clé étrangère. Il a migré par l'association de dépendance fonctionnelle _A MÈRE_ à partir de l'entité _ANIMAL_ en perdant son caractère identifiant. +- Le champ _nom mère_ est une clé étrangère. Il a migré par l'association de dépendance fonctionnelle _A MÈRE_ à partir de l'entité _ANIMAL_ en perdant son caractère identifiant. - Un champ entier _type alimentation_ est ajouté pour indiquer la nature de la spécialisation. Il est interprété comme un code binaire : bit 1 pour la première entité-fille, bit 2 pour la deuxième, etc. Peut être vide, du fait de l'absence de contrainte de totalité. - Un champ booléen _CARNIVORE_ est ajouté pour indiquer si on a affaire ou pas à la spécialisation de même nom. - Le champ _quantité viande_ a migré à partir de l'entité-fille _CARNIVORE_ (supprimée). - Un champ booléen _HERBIVORE_ est ajouté pour indiquer si on a affaire ou pas à la spécialisation de même nom. - Le champ _plante préférée_ a migré à partir de l'entité-fille _HERBIVORE_ (supprimée). -**ENCLOS** (num. enclos) -- **Avertissement.** Cette table ne comportant qu'un seul champ, on peut envisager de la supprimer. -- Le champ _num. enclos_ constitue la clé primaire de la table. C'était déjà un identifiant de l'entité _ENCLOS_. - **ESPÈCE** (code espèce, libellé) - Le champ _code espèce_ constitue la clé primaire de la table. C'était déjà un identifiant de l'entité _ESPÈCE_. - Le champ _libellé_ était déjà un simple attribut de l'entité _ESPÈCE_. **OCCUPE** (_#code espèce_, _#nom_, _#num. enclos_, _#date début_, _#date fin_) - Les champs _code espèce_ et _nom_ font partie de la clé primaire de la table. Ce sont des clés étrangères qui ont migré directement à partir de l'entité _ANIMAL_. -- Le champ _num. enclos_ fait partie de la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité _ENCLOS_. -- Le champ _date début_ est une clé étrangère issue de l'entité _PÉRIODE_. Il devrait normalement faire partie de l'identifiant de _OCCUPE_, mais a été rétrogradé explicitement au rang de simple attribut. -- Le champ _date fin_ est une clé étrangère issue de l'entité _PÉRIODE_. Il devrait normalement faire partie de l'identifiant de _OCCUPE_, mais a été rétrogradé explicitement au rang de simple attribut. +- Le champ _num. enclos_ fait partie de la clé primaire de la table. Sa table d'origine (_ENCLOS_) ayant été supprimée, il n'est pas considéré comme clé étrangère. +- Le champ _date début_ est un simple attribut. Sa table d'origine, _PÉRIODE_, ayant été supprimée, il n'est pas considéré comme clé étrangère. Il devrait normalement faire partie de l'identifiant de _OCCUPE_, mais a été rétrogradé explicitement au rang de simple attribut. +- Le champ _date fin_ est un simple attribut. Sa table d'origine, _PÉRIODE_, ayant été supprimée, il n'est pas considéré comme clé étrangère. Il devrait normalement faire partie de l'identifiant de _OCCUPE_, mais a été rétrogradé explicitement au rang de simple attribut. **PEUT COHABITER AVEC** (_#code espèce_, _#code espèce commensale_, nb. max. commensaux) - Les champs _code espèce_ et _code espèce commensale_ constituent la clé primaire de la table. Ce sont des clés étrangères qui ont migré directement à partir de l'entité _ESPÈCE_. @@ -219,11 +188,12 @@ ALTER TABLE `PEUT_VIVRE_DANS` ADD FOREIGN KEY (`code_espèce`) REFERENCES `ESPÈ **PEUT VIVRE DANS** (_#code espèce_, _#num. enclos_, nb. max. congénères) - Le champ _code espèce_ fait partie de la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité _ESPÈCE_. -- Le champ _num. enclos_ fait partie de la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité _ENCLOS_. +- Le champ _num. enclos_ fait partie de la clé primaire de la table. Sa table d'origine (_ENCLOS_) ayant été supprimée, il n'est pas considéré comme clé étrangère. - Le champ _nb. max. congénères_ était déjà un simple attribut de l'association _PEUT VIVRE DANS_. -**PÉRIODE** (date début, date fin) -- Les champs _date début_ et _date fin_ constituent la clé primaire de la table. C'était déjà des identifiants de l'entité _PÉRIODE_. +--- + +**NB.** Les tables _ENCLOS_ et _PÉRIODE_ ont été supprimées car elles étaient réduites à la clé primaire de leur entité d'origine. Pour empêcher cette supression, préfixez d'un « + » le nom de l'entité. ``` ### `oracle.json` @@ -245,13 +215,6 @@ CREATE TABLE "ANIMAL" ( PRIMARY KEY ("code_espèce", "nom") ); -/* -CREATE TABLE "ENCLOS" ( - "num_enclos" VARCHAR(42), - PRIMARY KEY ("num_enclos") -); -*/ - CREATE TABLE "ESPÈCE" ( "code_espèce" VARCHAR(42), "libellé" VARCHAR(42), @@ -281,20 +244,11 @@ CREATE TABLE "PEUT_VIVRE_DANS" ( PRIMARY KEY ("code_espèce", "num_enclos") ); -CREATE TABLE "PÉRIODE" ( - "date_début" VARCHAR(42), - "date_fin" VARCHAR(42), - PRIMARY KEY ("date_début", "date_fin") -); - ALTER TABLE "ANIMAL" ADD FOREIGN KEY ("code_espèce mère", "nom mère") REFERENCES "ANIMAL" ("code_espèce", "nom"); ALTER TABLE "ANIMAL" ADD FOREIGN KEY ("code_espèce") REFERENCES "ESPÈCE" ("code_espèce"); -ALTER TABLE "OCCUPE" ADD FOREIGN KEY ("date_début", "date_fin") REFERENCES "PÉRIODE" ("date_début", "date_fin"); --- ALTER TABLE "OCCUPE" ADD FOREIGN KEY ("num_enclos") REFERENCES "ENCLOS" ("num_enclos"); ALTER TABLE "OCCUPE" ADD FOREIGN KEY ("code_espèce", "nom") REFERENCES "ANIMAL" ("code_espèce", "nom"); ALTER TABLE "PEUT_COHABITER_AVEC" ADD FOREIGN KEY ("code_espèce commensale") REFERENCES "ESPÈCE" ("code_espèce"); ALTER TABLE "PEUT_COHABITER_AVEC" ADD FOREIGN KEY ("code_espèce") REFERENCES "ESPÈCE" ("code_espèce"); --- ALTER TABLE "PEUT_VIVRE_DANS" ADD FOREIGN KEY ("num_enclos") REFERENCES "ENCLOS" ("num_enclos"); ALTER TABLE "PEUT_VIVRE_DANS" ADD FOREIGN KEY ("code_espèce") REFERENCES "ESPÈCE" ("code_espèce"); ``` @@ -345,16 +299,6 @@ ALTER TABLE "PEUT_VIVRE_DANS" ADD FOREIGN KEY ("code_espèce") REFERENCES "ESPÈ
    -
    -
    ENCLOS ( - num. enclos - ) -
      -
    • Avertissement. Cette table ne comportant qu'un seul champ, on peut envisager de la supprimer.
    • -
    • Le champ num. enclos constitue la clé primaire de la table. C'était déjà un identifiant de l'entité ENCLOS.
    • -
    -
    -
    ESPÈCE ( code espèce, @@ -370,15 +314,15 @@ ALTER TABLE "PEUT_VIVRE_DANS" ADD FOREIGN KEY ("code_espèce") REFERENCES "ESPÈ
    OCCUPE ( #code espèce, #nom, - #num. enclos, - #date début, - #date fin + num. enclos, + date début, + date fin )
    • Les champs code espèce et nom font partie de la clé primaire de la table. Ce sont des clés étrangères qui ont migré directement à partir de l'entité ANIMAL.
    • -
    • Le champ num. enclos fait partie de la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité ENCLOS.
    • -
    • Le champ date début est une clé étrangère issue de l'entité PÉRIODE. Il devrait normalement faire partie de l'identifiant de OCCUPE, mais a été rétrogradé explicitement au rang de simple attribut.
    • -
    • Le champ date fin est une clé étrangère issue de l'entité PÉRIODE. Il devrait normalement faire partie de l'identifiant de OCCUPE, mais a été rétrogradé explicitement au rang de simple attribut.
    • +
    • Le champ num. enclos fait partie de la clé primaire de la table. Sa table d'origine (ENCLOS) ayant été supprimée, il n'est pas considéré comme clé étrangère.
    • +
    • Le champ date début est un simple attribut. Sa table d'origine, PÉRIODE, ayant été supprimée, il n'est pas considéré comme clé étrangère. Il devrait normalement faire partie de l'identifiant de OCCUPE, mais a été rétrogradé explicitement au rang de simple attribut.
    • +
    • Le champ date fin est un simple attribut. Sa table d'origine, PÉRIODE, ayant été supprimée, il n'est pas considéré comme clé étrangère. Il devrait normalement faire partie de l'identifiant de OCCUPE, mais a été rétrogradé explicitement au rang de simple attribut.
    @@ -397,26 +341,16 @@ ALTER TABLE "PEUT_VIVRE_DANS" ADD FOREIGN KEY ("code_espèce") REFERENCES "ESPÈ
    PEUT VIVRE DANS ( #code espèce, - #num. enclos, + num. enclos, nb. max. congénères )
    • Le champ code espèce fait partie de la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité ESPÈCE.
    • -
    • Le champ num. enclos fait partie de la clé primaire de la table. C'est une clé étrangère qui a migré directement à partir de l'entité ENCLOS.
    • +
    • Le champ num. enclos fait partie de la clé primaire de la table. Sa table d'origine (ENCLOS) ayant été supprimée, il n'est pas considéré comme clé étrangère.
    • Le champ nb. max. congénères était déjà un simple attribut de l'association PEUT VIVRE DANS.
    - -
    -
    PÉRIODE ( - date début, - date fin - ) -
      -
    • Les champs date début et date fin constituent la clé primaire de la table. C'était déjà des identifiants de l'entité PÉRIODE.
    • -
    -
    - +


    NB. Les tables ENCLOS et PÉRIODE ont été supprimées car elles étaient réduites à la clé primaire de leur entité d'origine. Pour empêcher cette supression, préfixez d'un « + » le nom de l'entité.
    @@ -445,13 +379,6 @@ CREATE TABLE "ANIMAL" ( FOREIGN KEY ("code_espèce mère", "nom mère") REFERENCES "ANIMAL" ("code_espèce", "nom") ); -/* -CREATE TABLE "ENCLOS" ( - "num_enclos" VARCHAR(42), - PRIMARY KEY ("num_enclos") -); -*/ - CREATE TABLE "ESPÈCE" ( "code_espèce" VARCHAR(42), "libellé" VARCHAR(42), @@ -465,9 +392,7 @@ CREATE TABLE "OCCUPE" ( "date_début" VARCHAR(42), "date_fin" VARCHAR(42), PRIMARY KEY ("code_espèce", "nom", "num_enclos"), - FOREIGN KEY ("code_espèce", "nom") REFERENCES "ANIMAL" ("code_espèce", "nom"), - -- FOREIGN KEY ("num_enclos") REFERENCES "ENCLOS" ("num_enclos"), - FOREIGN KEY ("date_début", "date_fin") REFERENCES "PÉRIODE" ("date_début", "date_fin") + FOREIGN KEY ("code_espèce", "nom") REFERENCES "ANIMAL" ("code_espèce", "nom") ); CREATE TABLE "PEUT_COHABITER_AVEC" ( @@ -485,13 +410,6 @@ CREATE TABLE "PEUT_VIVRE_DANS" ( "nb_max_congénères" VARCHAR(42), PRIMARY KEY ("code_espèce", "num_enclos"), FOREIGN KEY ("code_espèce") REFERENCES "ESPÈCE" ("code_espèce") - --, FOREIGN KEY ("num_enclos") REFERENCES "ENCLOS" ("num_enclos") -); - -CREATE TABLE "PÉRIODE" ( - "date_début" VARCHAR(42), - "date_fin" VARCHAR(42), - PRIMARY KEY ("date_début", "date_fin") ); ``` @@ -503,6 +421,7 @@ CREATE TABLE "PÉRIODE" ( "title_lowercase": "untitled", "title_uppercase": "UNTITLED", "title_titlecase": "Untitled", + "deleted_relations": ["ENCLOS", "PÉRIODE"], "relations": [ { "this_relation_name": "ANIMAL", @@ -801,39 +720,6 @@ CREATE TABLE "PÉRIODE" ( } ] }, - { - "this_relation_name": "ENCLOS", - "this_relation_name_lowercase": "enclos", - "this_relation_name_uppercase": "ENCLOS", - "this_relation_name_titlecase": "Enclos", - "is_forced": "False", - "columns": [ - { - "attribute": "num. enclos", - "raw_label": "num. enclos", - "raw_label_lowercase": "num. enclos", - "raw_label_uppercase": "NUM. ENCLOS", - "raw_label_titlecase": "Num. enclos", - "disambiguation_number": null, - "label": "num. enclos", - "label_lowercase": "num. enclos", - "label_uppercase": "NUM. ENCLOS", - "label_titlecase": "Num. enclos", - "primary": true, - "nature": "primary_key", - "data_type": null, - "association_name": null, - "association_name_lower_case": null, - "association_name_uppercase": null, - "association_name_titlecase": null, - "leg_note": null, - "outer_source": null, - "outer_source_lowercase": null, - "outer_source_uppercase": null, - "outer_source_titlecase": null - } - ] - }, { "this_relation_name": "ESPÈCE", "this_relation_name_lowercase": "espèce", @@ -958,7 +844,7 @@ CREATE TABLE "PÉRIODE" ( "label_uppercase": "NUM. ENCLOS", "label_titlecase": "Num. enclos", "primary": true, - "nature": "primary_foreign_key", + "nature": "primary_naturalized_foreign_key", "data_type": null, "association_name": "OCCUPE", "association_name_lower_case": "occupe", @@ -982,7 +868,7 @@ CREATE TABLE "PÉRIODE" ( "label_uppercase": "DATE DÉBUT", "label_titlecase": "Date début", "primary": false, - "nature": "demoted_foreign_key", + "nature": "demoted_naturalized_foreign_key", "data_type": null, "association_name": "OCCUPE", "association_name_lower_case": "occupe", @@ -1006,7 +892,7 @@ CREATE TABLE "PÉRIODE" ( "label_uppercase": "DATE FIN", "label_titlecase": "Date fin", "primary": false, - "nature": "demoted_foreign_key", + "nature": "demoted_naturalized_foreign_key", "data_type": null, "association_name": "OCCUPE", "association_name_lower_case": "occupe", @@ -1144,7 +1030,7 @@ CREATE TABLE "PÉRIODE" ( "label_uppercase": "NUM. ENCLOS", "label_titlecase": "Num. enclos", "primary": true, - "nature": "primary_foreign_key", + "nature": "primary_naturalized_foreign_key", "data_type": null, "association_name": "PEUT VIVRE DANS", "association_name_lower_case": "peut vivre dans", @@ -1181,63 +1067,6 @@ CREATE TABLE "PÉRIODE" ( "outer_source_titlecase": null } ] - }, - { - "this_relation_name": "PÉRIODE", - "this_relation_name_lowercase": "période", - "this_relation_name_uppercase": "PÉRIODE", - "this_relation_name_titlecase": "Période", - "is_forced": "False", - "columns": [ - { - "attribute": "date début", - "raw_label": "date début", - "raw_label_lowercase": "date début", - "raw_label_uppercase": "DATE DÉBUT", - "raw_label_titlecase": "Date début", - "disambiguation_number": null, - "label": "date début", - "label_lowercase": "date début", - "label_uppercase": "DATE DÉBUT", - "label_titlecase": "Date début", - "primary": true, - "nature": "primary_key", - "data_type": null, - "association_name": null, - "association_name_lower_case": null, - "association_name_uppercase": null, - "association_name_titlecase": null, - "leg_note": null, - "outer_source": null, - "outer_source_lowercase": null, - "outer_source_uppercase": null, - "outer_source_titlecase": null - }, - { - "attribute": "date fin", - "raw_label": "date fin", - "raw_label_lowercase": "date fin", - "raw_label_uppercase": "DATE FIN", - "raw_label_titlecase": "Date fin", - "disambiguation_number": null, - "label": "date fin", - "label_lowercase": "date fin", - "label_uppercase": "DATE FIN", - "label_titlecase": "Date fin", - "primary": true, - "nature": "primary_key", - "data_type": null, - "association_name": null, - "association_name_lower_case": null, - "association_name_uppercase": null, - "association_name_titlecase": null, - "leg_note": null, - "outer_source": null, - "outer_source_lowercase": null, - "outer_source_uppercase": null, - "outer_source_titlecase": null - } - ] } ] } @@ -1255,13 +1084,14 @@ CREATE TABLE "PÉRIODE" ( - quantité viande - HERBIVORE : _BOOLEAN_ - plante préférée -- num. enclos - code espèce - libellé -- nb. max. commensaux -- nb. max. congénères +- num. enclos - date début - date fin +- nb. max. commensaux +- num. enclos +- nb. max. congénères ``` ### `html.json` @@ -1295,13 +1125,6 @@ CREATE TABLE "PÉRIODE" ( plante préférée )
    -
    ESPÈCE ( code espèce, @@ -1312,9 +1135,9 @@ CREATE TABLE "PÉRIODE" ( OCCUPE ( #code espèce, #nom, - #num. enclos, - #date début, - #date fin + num. enclos, + date début, + date fin )
    @@ -1327,16 +1150,10 @@ CREATE TABLE "PÉRIODE" (
    PEUT VIVRE DANS ( #code espèce, - #num. enclos, + num. enclos, nb. max. congénères )
    -
    - PÉRIODE ( - date début, - date fin - ) -
    @@ -1360,12 +1177,10 @@ CREATE TABLE "PÉRIODE" ( \begin{mld} Animal & (\foreign{\prim{code espèce}}, \prim{nom}, \attr{sexe}, \attr{date naissance}, \attr{date décès}, \foreign{code espèce mère}, \foreign{nom mère}, \attr{type alimentation}, \attr{CARNIVORE}, \attr{quantité viande}, \attr{HERBIVORE}, \attr{plante préférée})\\ -% Enclos & (\prim{num. enclos})\\ Espèce & (\prim{code espèce}, \attr{libellé})\\ - Occupe & (\foreign{\prim{code espèce}}, \foreign{\prim{nom}}, \foreign{\prim{num. enclos}}, \foreign{date début}, \foreign{date fin})\\ + Occupe & (\foreign{\prim{code espèce}}, \foreign{\prim{nom}}, \prim{num. enclos}, \attr{date début}, \attr{date fin})\\ Peut cohabiter avec & (\foreign{\prim{code espèce}}, \foreign{\prim{code espèce commensale}}, \attr{nb. max. commensaux})\\ - Peut vivre dans & (\foreign{\prim{code espèce}}, \foreign{\prim{num. enclos}}, \attr{nb. max. congénères})\\ - Période & (\prim{date début}, \prim{date fin})\\ + Peut vivre dans & (\foreign{\prim{code espèce}}, \prim{num. enclos}, \attr{nb. max. congénères})\\ \end{mld} ``` @@ -1373,12 +1188,10 @@ CREATE TABLE "PÉRIODE" ( ```plain ANIMAL (_#code espèce_, _nom_, sexe, date naissance, date décès, #code espèce mère, #nom mère, type alimentation, CARNIVORE, quantité viande, HERBIVORE, plante préférée) -ENCLOS (_num. enclos_) ESPÈCE (_code espèce_, libellé) -OCCUPE (_#code espèce_, _#nom_, _#num. enclos_, #date début, #date fin) +OCCUPE (_#code espèce_, _#nom_, _num. enclos_, date début, date fin) PEUT COHABITER AVEC (_#code espèce_, _#code espèce commensale_, nb. max. commensaux) -PEUT VIVRE DANS (_#code espèce_, _#num. enclos_, nb. max. congénères) -PÉRIODE (_date début_, _date fin_) +PEUT VIVRE DANS (_#code espèce_, _num. enclos_, nb. max. congénères) ``` ### `txt2tags.json` @@ -1389,12 +1202,10 @@ Généré par Mocodo %%mtime(%c) %!encoding: utf8 - **ANIMAL** (__#code espèce__, __nom__, sexe, date naissance, date décès, #code espèce mère, #nom mère, type alimentation, CARNIVORE, quantité viande, HERBIVORE, plante préférée) -%% - **ENCLOS** (__num. enclos__) - **ESPÈCE** (__code espèce__, libellé) -- **OCCUPE** (__#code espèce__, __#nom__, __#num. enclos__, #date début, #date fin) +- **OCCUPE** (__#code espèce__, __#nom__, __num. enclos__, date début, date fin) - **PEUT COHABITER AVEC** (__#code espèce__, __#code espèce commensale__, nb. max. commensaux) -- **PEUT VIVRE DANS** (__#code espèce__, __#num. enclos__, nb. max. congénères) -- **PÉRIODE** (__date début__, __date fin__) +- **PEUT VIVRE DANS** (__#code espèce__, __num. enclos__, nb. max. congénères) ``` ### `postgresql.json` @@ -1419,13 +1230,6 @@ CREATE TABLE ANIMAL ( PRIMARY KEY (code_espèce, nom) ); -/* -CREATE TABLE ENCLOS ( - num_enclos VARCHAR(42), - PRIMARY KEY (num_enclos) -); -*/ - CREATE TABLE ESPÈCE ( code_espèce VARCHAR(42), libellé VARCHAR(42), @@ -1455,20 +1259,11 @@ CREATE TABLE PEUT_VIVRE_DANS ( PRIMARY KEY (code_espèce, num_enclos) ); -CREATE TABLE PÉRIODE ( - date_début VARCHAR(42), - date_fin VARCHAR(42), - PRIMARY KEY (date_début, date_fin) -); - ALTER TABLE ANIMAL ADD FOREIGN KEY (code_espèce mère, nom mère) REFERENCES ANIMAL (code_espèce, nom); ALTER TABLE ANIMAL ADD FOREIGN KEY (code_espèce) REFERENCES ESPÈCE (code_espèce); -ALTER TABLE OCCUPE ADD FOREIGN KEY (date_début, date_fin) REFERENCES PÉRIODE (date_début, date_fin); --- ALTER TABLE OCCUPE ADD FOREIGN KEY (num_enclos) REFERENCES ENCLOS (num_enclos); ALTER TABLE OCCUPE ADD FOREIGN KEY (code_espèce, nom) REFERENCES ANIMAL (code_espèce, nom); ALTER TABLE PEUT_COHABITER_AVEC ADD FOREIGN KEY (code_espèce commensale) REFERENCES ESPÈCE (code_espèce); ALTER TABLE PEUT_COHABITER_AVEC ADD FOREIGN KEY (code_espèce) REFERENCES ESPÈCE (code_espèce); --- ALTER TABLE PEUT_VIVRE_DANS ADD FOREIGN KEY (num_enclos) REFERENCES ENCLOS (num_enclos); ALTER TABLE PEUT_VIVRE_DANS ADD FOREIGN KEY (code_espèce) REFERENCES ESPÈCE (code_espèce); ``` diff --git a/test/snapshots/snapshot_static.svg b/test/snapshots/snapshot_static.svg index 992cee21..916c810c 100644 --- a/test/snapshots/snapshot_static.svg +++ b/test/snapshots/snapshot_static.svg @@ -1,6 +1,6 @@ - + diff --git a/test/test_relations.py b/test/test_relations.py index e899b0bc..ba0e1bda 100755 --- a/test/test_relations.py +++ b/test/test_relations.py @@ -19,16 +19,16 @@ class relationsTest(unittest.TestCase): def test_character_cases(self): clauses = """ - Riot: clue + Riot: clue, protect_riot Into, 11 Form, 1N Riot: goat Form: land, hide Tuck, 1N Read, 1N Form: thin - Read: wage + Read: wage, protect_read """ text = """ Form (_land_, hide, #clue, goat) - Read (_wage_) - Riot (_clue_) + Read (_wage_, protect_read) + Riot (_clue_, protect_riot) Tuck (_#wage_, _#land_, thin) """.strip().replace(" ", "") t = Relations(Mcd(clauses.split("\n"), params), params) @@ -70,17 +70,17 @@ def test_character_cases(self): def test_attribute_nature_simple(self): clauses = """ - Riot: clue + Riot: clue, protect_riot Into, 11 Form, 1N Riot: goat Form: land, hide Tuck, 1N Read, 1N Form: thin - Read: wage + Read: wage, protect_read """ t = Relations(Mcd(clauses.split("\n"), params), params) text = """ Form (_land_, hide, #clue, goat) - Read (_wage_) - Riot (_clue_) + Read (_wage_, protect_read) + Riot (_clue_, protect_riot) Tuck (_#wage_, _#land_, thin) """.strip().replace(" ", "") self.assertEqual(t.get_text(minimal_template), text) @@ -110,21 +110,21 @@ def test_attribute_nature_simple(self): def test_attribute_nature_complex(self): clauses = """ - Riot: clue + Riot: clue, protect_riot Walk, 1N Riot, _11 Hour Hour: book Poll, 1N Cast, /1N Hour - Cast: mere + Cast: mere, protect_cast [Army], 1N Busy, 01 Cast - Busy: fail + Busy: fail, protect_busy """ text = """ Army (_#mere_, #fail) - Busy (_fail_) - Cast (_mere_) + Busy (_fail_, protect_busy) + Cast (_mere_, protect_cast) Hour (_#clue_, _book_) Poll (_#mere_, #clue, #book) - Riot (_clue_) + Riot (_clue_, protect_riot) """.strip().replace(" ", "") t = Relations(Mcd(clauses.split("\n"), params), params) self.assertEqual(t.get_text(minimal_template), text) @@ -569,7 +569,7 @@ def test_weak_entities_strengthened_by_itself(self): def test_weak_entities_strengthened_by_several_entities(self): clauses = """ - Baby: Soon + Baby: Soon, protect_baby Yard, _11 Unit, ON Baby: Hall : @@ -580,7 +580,7 @@ def test_weak_entities_strengthened_by_several_entities(self): Ever, _11 Unit, 1N Item: Tour """ expected = """ - Baby (_Soon_) + Baby (_Soon_, protect_baby) Item (_Norm_, Wash) Unit (_#Norm_, _#Soon_, _Folk_, Peer, Hall, Tour) """.strip().replace(" ", "") @@ -788,7 +788,6 @@ def test_inheritance_leftwards_simple_arrow_with_right_arrow(self): self.assertEqual(d["relations"][0]["columns"][3]["attribute"], "quantité viande") self.assertEqual(d["relations"][0]["columns"][3]["nature"], "deleted_child_attribute") - def test_inheritance_leftwards_simple_arrow_with_left_arrow(self): clauses = """ /\ ANIMAL <-< CARNIVORE, HERBIVORE: type @@ -863,8 +862,6 @@ def test_two_same_type_inheritances(self): : """ text = """ - Abonnées () - Inscrites () Invitées (_#idU_, adresseIP) Utilisatrices (_idU_, email, catégorie) UtilisatricesPlus (_#idU_, nom, prénom, catégorie) @@ -872,5 +869,61 @@ def test_two_same_type_inheritances(self): t = Relations(Mcd(clauses.split("\n"), params), params) self.assertEqual(t.get_text(minimal_template), text) + def test_delete_deletable_tables(self): + clauses = """ + Prof: Num. prof, Nom prof + Enseigner, 1N Prof, 1N Élève + Élève: Num. élève, Nom élève + + Position: Latitude, _Longitude + Évaluer, 1N Élève, 0N Prof, 0N Position, 1N Date: Note + Date: Date + DF, 11 Élève, 0N Date + """ + text = """ + Enseigner (_#Num. prof_, _#Num. élève_) + Prof (_Num. prof_, Nom prof) + Élève (_Num. élève_, Nom élève, Date) + Évaluer (_#Num. élève_, _#Num. prof_, _Latitude_, _Longitude_, _Date_, Note) + """.strip().replace(" ", "") + t = Relations(Mcd(clauses.split("\n"), params), params) + self.assertEqual(t.get_text(minimal_template), text) + d = json.loads(t.get_text(json_template)) + self.assertEqual(d["relations"][2]["columns"][2]["attribute"], "Date") + self.assertEqual(d["relations"][2]["columns"][2]["nature"], "naturalized_foreign_key") + self.assertEqual(d["relations"][3]["columns"][2]["attribute"], "Latitude") + self.assertEqual(d["relations"][3]["columns"][2]["nature"], "primary_naturalized_foreign_key") + self.assertEqual(d["relations"][3]["columns"][4]["attribute"], "Date") + self.assertEqual(d["relations"][3]["columns"][4]["nature"], "primary_naturalized_foreign_key") + + def test_keep_deletable_tables(self): + clauses = """ + +Prof: Num. prof, Nom prof + Enseigner, 1N Prof, 1N Élève + Élève: Num. élève, Nom élève + +Position: Latitude, _Longitude + Évaluer, 1N Élève, 0N Prof, 0N Position, 1N Date: Note + +Date: Date + DF, 11 Élève, 0N Date + """ + text = """ + Date (_Date_) + Enseigner (_#Num. prof_, _#Num. élève_) + Position (_Latitude_, _Longitude_) + Prof (_Num. prof_, Nom prof) + Élève (_Num. élève_, Nom élève, #Date) + Évaluer (_#Num. élève_, _#Num. prof_, _#Latitude_, _#Longitude_, _#Date_, Note) + """.strip().replace(" ", "") + t = Relations(Mcd(clauses.split("\n"), params), params) + self.assertEqual(t.get_text(minimal_template), text) + d = json.loads(t.get_text(json_template)) + self.assertEqual(d["relations"][4]["columns"][2]["attribute"], "Date") + self.assertEqual(d["relations"][4]["columns"][2]["nature"], "foreign_key") + self.assertEqual(d["relations"][5]["columns"][2]["attribute"], "Latitude") + self.assertEqual(d["relations"][5]["columns"][2]["nature"], "primary_foreign_key") + self.assertEqual(d["relations"][5]["columns"][4]["attribute"], "Date") + self.assertEqual(d["relations"][5]["columns"][4]["nature"], "primary_foreign_key") + + if __name__ == '__main__': unittest.main()