2009-12-30 25 views
0

Ok, c'est une question difficile à expliquer.MySQL - Trouver une clé unique pour chaque enregistrement, pas la clé primaire

Je crée une application qui aura PAGES, actuellement j'utilise PageID comme clé pour SEL l'enregistrement. Le problème que j'ai maintenant est que je veux que les utilisateurs puissent éditer des pages, mais ne perdent pas la page précédente (pour l'histoire, raisons de conservation d'enregistrement, comme un historique de changelog ou de page de wiki). Cela me fait penser que j'ai besoin d'un nouveau champ dans la table PAGE qui fait office de pageID, mais ce n'est pas la clé primaire qui est auto-incrémentée chaque fois qu'une ligne est ajoutée.

Google Docs a DOCID:/Doc docid = 0Af_mFtumB56WZGM4d3Y3d2JfMTNjcDlkemRjeg

De cette façon, je peux avoir plusieurs enregistrements avec le même ID Doc, et afficher un journal de changement historique en fonction du champ dataAdded. Et quand un utilisateur veut voir ce DOCID, je tire simplement le plus récent.

Pensées? J'apprécie votre pensée intelligente pour me diriger dans la bonne direction!

+0

ou peut-être que je devrais utiliser parentID? Récursive? – AnApprentice

Répondre

0

chaque document est vraiment une révision:

doc - (doc_id)

révision - (rev_id, doc_id, version_num, nom, description, contenu, author_id, par défaut tinyint actif 1)

alors vous pouvez ouvrir n'importe quel contenu avec juste le rev_id:/view? id = 21981

sélectionnez * à partir de la révision r, doc d où r.rev_id =? et r.doc_id = d.doc_id

+0

très intéressant ... Alors, quelle est la clé PRIMAIRE dans la DB? – AnApprentice

+1

Oui, cela ressemble à votre recherche de la même chose que moi. http://stackoverflow.com/questions/1933929/database-table-setup-for-revision-tracking-with-orm – Xeoncross

+0

rev_id est le pk – jspcal

0

Conservez une table d'audit avec l'historique des modifications. Cela vous permettra de revenir en arrière si vous avez besoin d'annuler les modifications ou d'afficher l'historique des modifications par exemple.

+0

Est-ce que Wiki ou n'importe quelle application le fait? – AnApprentice

0

Vous pouvez le modeler comme ceci:

  • Une application comporte plusieurs pages, une page a plusieurs versions (chacune avec quelques informations de version (par exemple, la date, le nombre d'édition) et une clé étrangère à sa page)
  • Afficher une page version la plus récente
  • Enregistrement d'une modification crée une nouvelle version
2

Vous êtes sur la bonne voie. Ce dont vous avez besoin est un identifiant d'historique ou de révision, et un identifiant de document. L'identifiant de l'historique serait la clé primaire, mais vous auriez également une clé sur l'identifiant du document à des fins de requête. Avec le suivi de l'historique, vous ajoutez un peu plus de complexité à votre application. Vous devez faire attention à ce que la vue principale du document montre la révision de l'historique en cours (c'est-à-dire le plus grand identifiant d'historique pour un identifiant de document donné). De plus, si vous stockez des documents volumineux, chaque modification va essentiellement ajouter une autre copie du document à votre base de données, et la table deviendra rapidement très volumineuse. Vous pouvez envisager d'implémenter un type de stockage «diff», dans lequel vous ne stockez que les modifications apportées au document et non le fichier complet, ou gardez les modifications de l'historique dans une table distincte pour la recherche dans l'historique uniquement.

+0

Un moyen simple de faire du stockage DIFF? Je veux mieux comprendre votre Revision_ID, Doc_ID. Pouvez-vous fournir quelques exemples d'enregistrements?/table? – AnApprentice

1

UUID() crée un certain nombre de 128bit généré au hasard, comme '6ccd780c-baba-1026-9564-0040f4311e29' Ce numéro ne sera pas répété dans quelques années de millions.

// remarque que la plupart des chiffres sont basés sur des informations d'horodatage et de machine, donc beaucoup de chiffres seront similaires lors d'appels répétés, mais ils seront toujours uniques.

0

Cela me semble être un bon travail pour deux tables. Vous pouvez avoir une table page_header et une table page_content. La table d'en-tête contiendrait des informations statiques comme le titre, la catégorisation (peu importe) et la table de contenu contiendrait le contenu éditable réel. Chaque fois que l'utilisateur met à jour la page, insérez un nouvel enregistrement page_content par rapport à la mise à jour d'un enregistrement existant. Lorsque vous affichez la page, assurez-vous de saisir le dernier enregistrement page_content. C'est un moyen simple de garder un historique et de revenir en arrière si nécessaire.

Bonne chance!

+0

Est-ce ainsi que WIKI, comme Wikipedia, fait le travail? – AnApprentice