Conception de base de données dynamique des champs: une seule table ou plusieurs tables - de nombreux indices

- Je choisir la structure d'une base de données qui enregistre les types de contenu (par exemple. Les articles de Blog, Pages, Documents, Factures, devis, etc..) avec la dynamique des champs: par exemple, la Estimate type de contenu doit avoir les champs title, date et total price.

Toutefois, dans le temps, ces champs peuvent être ajoutés minerai supprimé, donc après 1 an, le Estimate contant type peut avoir la notes champ.

C'est une tâche commune prévue par le célèbre CMS (drupal par exemple), mais je me demande quelle est la meilleure approche pour avoir les meilleurs performances et de la flexibilité: Drupal, par exemple l'utiliser pour avoir une table avec basic champs (par exemple,title), et tous les champs secondaires sont stockés dans des sous-tableaux créés à la volée et lié à la principale avec les clés étrangères:

table node
| id | title         | ...
|  1 | First example |
table fields_node_total_price
| id | node_id | value  |
|  1 | 1       | 123.45 |
table fields_node_date
| id | node_id | value    |
|  1 | 1       | 12345677 |

etc..

Mon point de vue est que cette approche est très flexible mais facile de tomber dans le problème de performance: pour obtenir tous les champs pour un document, vous devez joindre les tables à de nombreuses reprises, et le code lui-même à la parcourir plusieurs fois pour construire la requête (mais cela ne devrais pas être un problème).

Btw multi-table est le plus utilisé.. donc doit avoir de nombreux inconvénients.

Im penser à ce genre de disvantages le fait d'utiliser une seule table:

| id | title | total_price | date | ec...

J'ai fait quelques tests avec 5 et 50 autres champs; les de performance entre l'unique approche de table et de la table multi-approche sont énormes: une seule table est d'environ 50x fois plus rapide.

Chaque fois qu'un champ est ajouté, une colonne est ajoutée à la table.. ce genre de problèmes que cette approche hausse?

MODIFIER

Permettez-moi d'apporter quelques précisions:

  1. L'application est encore en phase de conception, est une refonte complète d'une application ancienne où les champs de numéros étaient statiques
  2. Nous avons fait quelques essais de simulation d'un objet à stocker, à la fois avec une seule approche de table de table et multi approche (à l'aide de 50 champs), les résultats sont les suivants:

Temps en secondes:

Test                                                            1°          2°          3°          4°          5°          avg
1000 insert single_table                                        8,5687      8,6832      8,7143      8,7977      8,6906      8,69090137389466
1000 select single table LIKE '%key%' on char(250) field        1,5539      1,5540      1,5591      1,5602      1,5564      1,556705142
1000 select single table LIKE '%key%' on char(25) field         0,8848      0,8923      0,8894      0,8919      0,8888      0,889427996
1000 select single table id = $n                                0,2645      0,2620      0,2645      0,2632      0,2636      0,263564462
1000 select single table integer field < $j                     0,8627      0,8759      0,8673      0,8713      0,8767      0,870787334
1000 insert multi_table                                         446,3830    445,2843    440,8151    436,6051    446,0302    443,023531816
1000 select multi table LIKE '%key%' on char(250) field         1,7048      1,6822      1,6817      1,7041      1,6840      1,691367196
1000 select multi table LIKE '%key%' on char(25) field          0,9391      0,9365      0,9382      0,9431      0,9408      0,939536426
1000 select multi table id = $n                                 0,9336      0,9287      0,9349      0,9331      0,9428      0,93460784
1000 select multi table integer field < $j                      2,3366      2,3260      2,3134      2,3342      2,3228      2,326600456
"vous devez interroger la base de données à de nombreuses reprises" - euh, non. Vous feriez construire une seule requête qui joint à chacune des tables que vous voulez récupérer des données. "le code lui-même à la parcourir de nombreuses fois" - encore une fois, non, sauf si vous faites quelque chose de bizarre.
vous êtes à la droite; avec query the db many times je veux dire même construire une requête avec plusieurs jointures, qui en général pourrait entraîner le rendement lent
peut-être que cette question était un meilleur ajustement pour dba.stackexchange.com ?

OriginalL'auteur Strae | 2012-01-10