[database] Wijzigingshistorie van records vastleggen: hoe?

Pagina: 1
Acties:

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 00:12

Tomatoman

Fulltime prutser

Topicstarter
Ik heb een projectmanagementtool geschreven waarin het verloop van activiteiten wordt bijgehouden. Er wordt gewerkt met 'work orders', die een bepaalde activiteit aangeven. Bij iedere work order wordt het statusverloop bijgehouden. Zie de screenshot hieronder. Eén work order is opengeklapt, waardoor je het statusverloop van die work order kunt zien.

Afbeeldingslocatie: http://home.planet.nl/~gerre120/linked/lcgt_screenie.gif

Afhankelijk van de toegekende rechten kunnen gebruikers statusregels toevoegen en eventueel ook aanpassen of verwijderen. Nu wil ik wat extra code in het servergedeelte inbouwen zodat statusrecords wel verwijderd kunnen worden, maar niet daadwerkelijk uit de database worden verwijderd. Hiervoor moet ik wat business logic in de server inbouwen, zodat hij records markeert als 'verwijderd' en ze voortaan niet meer aan de gebruikers getoond worden.

Maar wat nu als een gebruiker alle commentaren uit een record verwijdert en hem opslaat? Dan houd je dus een nutteloze record over, maar je bent alle gegevens van vóór de wijziging kwijt. Nu wil ik niet iedere wijziging als een aparte record in de database stoppen - de database explodeert dan al snel en eigenlijk zit ik ook niet te wachten op allerlei wijzigingsrecords waarin gebruikers bijvoorbeeld typfouten herstellen. Mijn algemene vraag is nu: wat zou hier een goed scenario zijn om een redelijke wijzigingshistorie bij te houden zonder ieder wissewasje op te slaan?

Een goede grap mag vrienden kosten.


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Persoonlijk vind ik de meest eenduidige oplossing om wel alle wijzigingen op te slaan.
Wat zijn zware bezwaren om dat niet te doen?
storage? onduidelijkheid op het scherm? performance?

Who is John Galt?


  • cobratbq
  • Registratie: Maart 2001
  • Laatst online: 17-12-2015
Wat ik meestal doe is een 'bool status' visible/deleted of natuurlijk een tinyint als je meerdere statussen hebt.
Je kunt dan dmv een Unix TimeStamp een datum eraanplakken waardoor je in een regeltje cijfers alles bij de hand hebt.

One ring to rule them all, one ring to find them, one ring to bring them all, and in darkness bind them...


  • B-Man
  • Registratie: Februari 2000
  • Niet online
Werken met duidelijke rechten? Een gebruiker kan enkel toevoegen, een admin wijzigen/verwijderen?
Het hangt er vanaf wat je wilt afvangen. Wil je voorkomen dat gegevens "verdwijnen" doordat users een record legen en het dan opslaan, dan kun je doen wat ik voorstel: ervoor zorgen dat ze dit niet kunnen, of alle wijzigingen opslaan (CVS-achtig), zodat je altijd kan zien wie wat wanneer gewijzigd heeft.

Verwijderd

Wellicht in de business logic checken of nieuwe waarde 'leeg' wordt of het percentage of aantal karakterwijzigingen berekenen en aan de hand daarvan wel of niet de wijziging in de historie opslaan.


W00t. Delphi? en wat voor component is dat?

  • cobratbq
  • Registratie: Maart 2001
  • Laatst online: 17-12-2015
Wat misschien wel een leuk idee is: een PHP forum downloaden en kijken hoe dit in elkaar zit. Dan heb je ideëen zat, want in zo'n forum (iig het YABBse forum) worden ook alle wijzingen bijgehouden (ik weet niet precies in hoeverre) maar die lui hebben denk ik ook wel wat ervaring en aan de hand daarvan kun je misschien het beste een strategie bepalen.

One ring to rule them all, one ring to find them, one ring to bring them all, and in darkness bind them...


  • zneek
  • Registratie: Augustus 2001
  • Laatst online: 08-02-2025
tjah, hier zijn 1000 en 1 oplossingen voor te verzinnen. Wat zijn je grensen? De veiligste oplossing (waarbij je zeker weet dat je alles terug kunt vinden) is een schaduw tabel aanmaken waar je elk record in dumpt voor een update statement. Dat gecombineerd met een deleted true/false (is nog niet eens nodig) geeft je de mogelijkheid om alles terug te vinden. Sla het ook nog eens op met user/login gegevens en je kunt ook nog alles tracken.

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 00:12

Tomatoman

Fulltime prutser

Topicstarter
Het is niet nodig dat alles compleet wordt dichtgetimmerd. De gebruikers weten allemaal hoe een computer eruit ziet en ik ben niet bang dat ze doelbewust de database-inhoud gaan verpesten. Wat ik wil voorkomen is dat er per ongeluk gegevens verdwijnen.

Direct een record vergrendelen nadat het gemaakt is, is niet erg praktisch. Dan kun je nooit meer een foutje herstellen. Dat wil ik dus niet. Rechtenmanagement lijkt me de voorlopig meest praktische oplossing en zeker de meest eenvoudige. Ik heb echter geen ervaring met het bijhouden van een wijzigingshistorie in een database, vandaar mijn vraag naar de best oplossing.

@sinaasappelsap: Dat had je goed gezien, inderdaad geschreven in Delphi (gezien mijn reacties in GoT ook geen verrassing). Het grid is ExpressQuantumGrid 4 van Developer Express. Erg mooi, erg uitgebreid, maar ook erg ingewikkeld.

Een goede grap mag vrienden kosten.


  • TheDane
  • Registratie: Oktober 2000
  • Laatst online: 21-08 23:36

TheDane

1.618

nou, als je bang bent dat gegevens verwijderd worden kun je toch gewoon backups maken van je database ?

en verwijder-rechten limiteren, alertwindowtjes openen etc?

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 21-08 18:29
nou, als je bang bent dat gegevens verwijderd worden kun je toch gewoon backups maken van je database ?
Dat is wel een laatste redmiddel, meer bedoeld voor als je server wordt gehacked of je server verbrand of iets dergelijks maar voor het verwijderen van records zijn er eenvoudigere oplossingen.

Meestal zie je dat er in plaats van een update statement gewoon een insert statement gedaan wordt met alle wijzigingen. De verandering van zichtbaar naar onzichtbaar is dus ook een wijziging, dit is namelijk gewoon een waarde in een kolom van je database. In de weergave van het systeem wordt dan automatisch alleen de laatste versie van het record weergegeven. Als je slim bent geef je ook nog een parentid mee zodat je hele leuke overzichtjes van wijzigingen kunt tonen.

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 07:56

alienfruit

the alien you never expected

Tomatoman, zelf heb ik ook een bug signalerings programma gemaakt waarbij ik alle wijzigingen opsla (dmv. triggers) waarbij ik de laatste wijziging altijd altijd als eerste laat zien en via Expand kan de gebruiker de laatste 10 wijzigingen zien. Dit werkt prima in de user interface. Technisch gezien sla ik gewoon alles op via minor major build in een apart tabel (version_history) en koppel het via een kolom parent_item_id aan elkaar. Maar als iemand anders een beter idee heeft, ben nog niet zo'n ster in database modellen! Eerste keer dat ik triggers en stored procedures gebruikte. ;)

code:
1
2
3
4
5
6
7
8
9
10
11
12
tbl_bugs
item_info
item_id [autoincrement int]
item_group_id [references int naar item_groups tabel]
..itemprops..

tbl_history
item_id [autoincrement int]
parent_groupby_item_id [1..1 relatie naar tbl_bugs bijv.]
item_minor_version [int]
item_major_version [int]
item_build_version [int]


Volgens mij gebruik je voor de icoontjes GlyFX of niet?
@sinaasappelsap: Dat had je goed gezien, inderdaad geschreven in Delphi (gezien mijn reacties in GoT ook geen verrassing). Het grid is ExpressQuantumGrid 4 van Developer Express. Erg mooi, erg uitgebreid, maar ook erg ingewikkeld.
Aha. ExpressQuantumGrid is fantastisch, ik ben ook aan het sparen om het te kopen via http://dio.delphideli.com/dionysus.dll/. Ik gebruik zelf all ExpressBars v5 alleen die vindt ik toch wat te groot en log maar verder hardstikek mooi natuurlijk! Toolbar2000 heeft een kleinere footprint (noem je dat zo??) en een stuk goedkoper ;)

[ Voor 42% gewijzigd door alienfruit op 24-07-2003 10:38 ]


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 00:12

Tomatoman

Fulltime prutser

Topicstarter
TheDane schreef op 24 juli 2003 @ 08:06:
nou, als je bang bent dat gegevens verwijderd worden kun je toch gewoon backups maken van je database ?

en verwijder-rechten limiteren, alertwindowtjes openen etc?
Het probleem is dat als er hooguit een paar records verwijderd zijn, je dat absoluut niet doorhebt. Als een complete tabel wordt gewist zie je direct dat er iets niet klopt, maar één verdwenen record valt je meestal pas op als het te laat is (als de klant meldt dat de rapportages niet kloppen of zo :)).
alienfruit schreef op 24 juli 2003 @ 10:31:
[...] Volgens mij gebruik je voor de icoontjes GlyFX of niet?
Een deel van de icons is van Glyfz (erg goede kwaliteit) en een deel heb ik zelf in elkaar geklust. Je kunt een beperkte set Glyfz icons gratis en legaal downloaden :9~; zie http://icons4free.artshost.com voor een overzicht van deze set.

Een goede grap mag vrienden kosten.


  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 07:56

alienfruit

the alien you never expected

Ja, Ik weet het tomatoman echt goeie icons mijn vader heeft bijna alle sets gekocht :)
Pagina: 1