Ouverture de session

Commentaires récents

Syndication
Flux XML

Clé primaire composée???

Clé primaire composée???
Posté par cissou06 le Mercredi, 9 Juillet, 2008 - 11:18am. Trucs & Astuces

Bonjour!

J'essaie d'intégrer un wiki dans mon appli. J'ai créé une table wikis (ayant un ID et un title) et une table wpages ayant comme champs ID, wiki_id (clé étrangère), content, et version. En effet pour une même page j'aimerais garder en mémoire son historique, ce qui veut dire que je me retrouverai plusieurs fois avec le même ID mais des versions différentes... IMPOSSIBLE!

Donc je me demandais s'il était possible de définir comme clé primaire le couple ID-Version? Et si cela est faisable comment s'y prendre?

Merci d'avance!



[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | sujet précédent | sujet suivant | envoyer par email ]

Options d'affichage des commentaires
Sélectionnez la méthode d'affichage des commentaires que vous préférez, puis cliquez sur "Sauvegarder" pour activer vos changements.

Sujet: 
Salut,
Auteur: 
Zifro
Date: 
Jeu, 31/07/2008 - 13:58

Salut,

pour définir une clé composée comme clé primaire, il te faut recourir à un plugin, comme CompositeKeys par exemple (http://compositekeys.rubyforge.org/).

Mais dans le cas présent, intéresse-toi plutôt à Acts As Versioned (http://ar-versioned.rubyforge.org/), puisque c'est bien une gestion de version que tu veux faire.

Cordialement,

Guillaume "Zifro" DESRAT
http://zlab.fr/


[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | envoyer par email ]

Sujet: 
acts_as_versioned
Auteur: 
jasperiel
Date: 
Mer, 09/07/2008 - 17:03

Sinon, acts_as_versioned est peut-être ce qu'il te faut.

Le gem n'est hélas plus maintenu mais la page SourceForge a les patches à appliquer, notamment pour le faire tourner en 2.1 et pour ajouter divers trucs.


[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | envoyer par email ]

Sujet: 
Tu as un plugin qui gère
Auteur: 
lamyseba
Date: 
Mer, 09/07/2008 - 14:04

Tu as un plugin qui gère les clé primaire composée.
http://compositekeys.rubyforge.org/
Donc tu peux l'utiliser, mais je te recommande de garder un champs qui donne une id unique par ligne.
Donc tu laisse le champs ID (ta vrai clé primaire)
Tu rajoute un champs document_id (qui correpond à un document unique pouvant avoir plusieurs version)
Et tu déclare une clé primaire composé sur document_id et version, grace au plugin.

Si tu veux, tu peux rajouter une contrainte en base pour dire que ce couple (document_id, version) doit être unique

Je ne pense pas que le titre puisse être considéré comme pouvant remplacer document_id, sauf si c'est sur qu'il ne peut jamais être modifié.


[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | envoyer par email ]

Sujet: 
Pourquoi le champ doc_id?
Auteur: 
cissou06
Date: 
Mer, 09/07/2008 - 14:20

Merci pour ta réponse!

Par contre j'aimerais savoir pourquoi tu penses qu'il faut garder absolument un champ unique ID et créer un champ document_id? C'est une simple précaution où il y a une raison particulière? Parce que dans ce cas finalement je n'ai même plus besoin de déclarer mon couple document_id-version comme clé primaire, non?


[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | envoyer par email ]

Sujet: 
Le champ id est pas mal
Auteur: 
lamyseba
Date: 
Mer, 09/07/2008 - 17:58

Le champ id est pas mal utilisé par rails. Je n'ai pas testé le plugin que je t'ai recommandé, donc je ne sais pas si il gère bien les create, updates et les deletes d'objet ayant une clé primaire composé. Mais pour ce genre d'opèration, rails (sans le plugin) n'accepte pas d'avoir à se soucier d'autre chose qu'une clé primaire pour effectuer l'opération en base.
Concêtement, si tu as un document wiki dans la variable @wiki_doc, je ne suis pas sur que les fonction
@wiki_doc.save
@wiki_doc.destroy
@wiki.update_attributes(:text => "blabla", :author => "jean")
@wiki_doc.create(....)
marchent si il n'y a pas de clé primaire unique

L'intérêt d'avoir une clé composée, c'est la contrainte de l'unicité, mais tu peux mettre cette contrainte sans définir de clé composée, aussi bien au niveau de rails que directement en base.
L'autre intérêt, c'est une meilleure indexation, mais la encore tu peux créer les index en base sans créer une clé primaire composée.
Le dernier intérêt, c'est d'économiser une colonne dans ta base, mais si c'est pour ça, ça vaut vraiment pas le coup.

Donc par prudence, je te dirais: n'enlève pas à rails ce qu'il réclame pour gérer correctement les objet, à savoir une id unique pour identifier une ligne dans la base de donnée.
Effectivement, tu n'as pas besoin de déclarer le couple comme clé primaire, tu as juste à mettre des contrainte d'unicité en base et/ou dans rails, et rajouter éventuellement des index en base sur ces colonnes


[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | envoyer par email ]

Sujet: 
Je ferais la meme chose,
Auteur: 
dam5s
Date: 
Mer, 09/07/2008 - 15:33

Je ferais la meme chose, l'id sert a identifier le tuple.

"document_id" sert a identifier la page et "version" la version de la page. effectivement la combinaison "document_id + version" peut servir de clef primaire, mais c'est se compliquer la vie pour rien a mon avis.

il suffit de verifier l'unicite de la version sur le scope document_id et ca devrait etre suffisant.

--
Damien
http://www.webdrivenblog.com/


[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | envoyer par email ]

Sujet: 
Merci!
Auteur: 
cissou06
Date: 
Mer, 09/07/2008 - 15:49

Ok! Merci à tous les 2 pour vos réponses!


[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | envoyer par email ]

Sujet: 
heu avec id title et version
Auteur: 
dam5s
Date: 
Mer, 09/07/2008 - 12:57

heu avec id title et version tu as ce qu'il te faut non ? le titre etant unique pour une page (et donc partage par toutes les versions)

--
Damien
http://www.webdrivenblog.com/


[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | envoyer par email ]

Sujet: 
Pas vraiment...
Auteur: 
cissou06
Date: 
Mer, 09/07/2008 - 14:31

Le title est le titre de mon wiki qui lui contient plusieurs pages...

Mais je pense avoir compris ta logique. J'ai effectivement un champ title pour ma page, le pb c'est que si une des modifications à garder en base est justement le changement du titre de la page... là ça pose pb... A moins que la modification du titre de la page ne soit pas possible... est-ce que c'est le cas dans tous les wikis (je viens de voir que ça l'est pour les wikis de Wikispaces mais est-ce une généralité?)


[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | envoyer par email ]

Nouveaux liens

Qui est en ligne
Il y a actuellement 1 utilisateur et 31 invités en ligne.

railsfrance.org - communauté francophone des utilisateurs de Ruby on Rails
[ Propulsé par Drupal ]