2 votes

Comment concevoir plusieurs tables enfant par rapport à une seule table parent ?

Je serais reconnaissant si quelqu'un pouvait me conseiller sur la manière correcte d'aborder cette question :

  • J'ai une table parent, avec une clé primaire master_id .
  • J'ai cinq tables enfant associées au master_id, dans une relation de 1 à n, qui enregistrent des types de données sémantiquement différents (et ne se prêtent pas à l'abstraction).
  • Les seuls champs communs dans chaque table enfant sont master-id (clé étrangère), created_by (user_id), created_time (horodatage).

L'objectif est de publier chaque ligne enfant associée à un identifiant maître dans un ordre chronologique sur une page web (imaginez un affichage de type messages de forum), le PHP construisant chaque "message" (c'est-à-dire chaque ligne) de manière légèrement différente en fonction de la table enfant (et donc des champs de données dont il dispose).

Ai-je raison de penser qu'il n'y a pas de moyen facile de faire des requêtes, quelle que soit la structure de la table (et que le classement serait mieux fait en PHP) ? Y a-t-il un avantage à partitionner verticalement les 3 champs communs en une seule table combinée à un filtre de type table champ ?

2voto

King Skippus Points 2325

Il s'agit d'un problème très difficile à résoudre, sur lequel j'ai moi-même travaillé. Malheureusement, je n'ai pas de bonne réponse. Vous pourriez utiliser des UNIONs et différents types de JOINs, mais vous allez potentiellement nuire aux performances de votre base de données. De plus, vous vous heurtez à des problèmes tels que, disons que vous voulez les 30 entrées chronologiques les plus récentes. Vous devrez interroger chaque table enfant pour 30 entrées (peut-être 150 entrées en tout) et les trier dans votre code puisque vous ne savez pas quelle(s) table(s) enfant possède(nt) les 30 entrées les plus récentes. 150 lignes juste pour en extraire 30, c'est dommage.

Honnêtement, le meilleur moyen que j'ai trouvé pour mettre en œuvre une telle chose est d'avoir une table, éventuellement votre table principale, avec des colonnes dédiées spécifiquement à ce que vous voulez montrer à partir de votre table enfant. Par exemple, avoir des colonnes dans votre table principale qui sont quelque chose comme, master_id , created_by , created_time et notification_text (si vous essayez de mettre en œuvre quelque chose comme la timeline de Facebook, par exemple). Vous pouvez configurer des déclencheurs sur les tables enfant de sorte que lorsque vous insérez des données dans l'une d'entre elles, les données de la table principale sont automatiquement alimentées. Ensuite, lorsque vous affichez la chronologie, vous interrogez simplement la table principale sans vous préoccuper des tables enfant.

Votre schéma devrait ressembler à quelque chose comme :

Table master
- master_id
- created_by
- created_time
- notification_text

Table child1
- id
- master_id
- data1 (used to generate notification_text in master)

Table child2
- id
- master_id
- data21 (collectively used to generate notification_text in master)
- data22 (collectively used to generate notification_text in master)
- data23 (collectively used to generate notification_text in master)

...

0voto

EH_warch Points 1460

Et si vous utilisiez un modèle en étoile ? Il est généralement utilisé pour créer des entrepôts de données, mais vous pourriez essayer d'utiliser quelque chose de similaire dans votre solution. Si vous n'êtes pas familier avec le modèle en étoile, vous pouvez en savoir plus aquí .

J'espère que cela vous aidera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X