Ik heb een aantal websites draaien die elk gebruik maken van hun eigen MySQL database. De websites zijn in principe los van elkaar ontwikkeld en hebben weinig met elkaar te maken, op een belangrijk punt na: de user accounts voor een website komen vaak ook in de andere website voor. Dat wil zeggen, mensen die een account op website A hebben, hebben er ook vaak een op website B.
Omdat de websites los van elkaar ontwikkeld zijn is er echter een klein verschil tussen de accounts tabellen in beide databases. Bij website A bijvoorbeeld was het niet verplicht een email adres in te vullen, maar bij B wel (dus de email adres velden in database A zijn niet compleet). Bij website B was het verplicht voor elk account ook je echte naam op te geven, wat weer niet in database A zit.
Ik wil nu graag dat de websites gebruik gaan maken van een centrale database. Ik wil de databases dus eigenlijk mergen. Eigenlijk zijn alleen de user accounts tabellen een probleem hier, verder hebben tabellen in database A niks te maken met tabellen in database B dus die kunnen gewoon naast elkaar komen te staan.
Het probleem is dus de users tabel, die moet tussen A en B gemerged worden. Elke user heeft in de database gewoon een ID (autonumber), waarmee ik de user aan andere zaken uit andere tabellen koppel (bijvoorbeeld user 1 hoort bij groep X en Y, dat wordt dus gekoppeld via UserId en GroupId zoals gewoonlijk). Het probleem lijkt me nu duidelijk: Piet heeft een account op website A en op website B, maar die accounts zijn helemaal los van elkaar en hebben dus een ander ID. Als ik nu de tabellen gewoon blind zou mergen dan raakt Piet dus de helft van zijn data kwijt (afhankelijk of hij het ID uit database A of uit database B krijgt), de koppeling raakt verloren omdat de IDs niet meer kloppen.
Gelukkig is er ook goed nieuws: elk account in de users tabel (in beide databases) heeft verplicht nog een ander numeriek ID (dit is een ID van een andere website die niet binnen mijn controle valt, noem dit maar even ID2), en die is ook uniek per gebruiker. Op deze manier kan ik dus gebruikers van elkaar onderscheiden, ook al is er geen echte naam of geen email ingevuld, als ID2 gelijk is dan is het gegarandeerd dezelfde user.
Het is nu logisch om sowieso het niets-zeggende autonumber ID te laten vervallen en gewoon dit ID2 als unieke key te gebruiken per user. Dat heb ik eerder niet gedaan omdat mijn ORM dat lastig maakte, maar dat mag nu geen excuus zijn natuurlijk.
Ik vraag me eigenlijk af wat hier nu de mogelijkheden zijn. Ik kan vast wel een (aantal) queries verzinnen om de users tabellen met elkaar te mergen op ID2, maar dan raak ik dus nog steeds de koppeling met andere tabellen kwijt. Hoe zorg ik er nu voor dat ik deze koppeling kan behouden? Is hier een goeie strategie voor of wordt dit een drama? Moet ik "handmatig" (via queries) alle ID koppelingen gaan vervangen ofzo?
Omdat de websites los van elkaar ontwikkeld zijn is er echter een klein verschil tussen de accounts tabellen in beide databases. Bij website A bijvoorbeeld was het niet verplicht een email adres in te vullen, maar bij B wel (dus de email adres velden in database A zijn niet compleet). Bij website B was het verplicht voor elk account ook je echte naam op te geven, wat weer niet in database A zit.
Ik wil nu graag dat de websites gebruik gaan maken van een centrale database. Ik wil de databases dus eigenlijk mergen. Eigenlijk zijn alleen de user accounts tabellen een probleem hier, verder hebben tabellen in database A niks te maken met tabellen in database B dus die kunnen gewoon naast elkaar komen te staan.
Het probleem is dus de users tabel, die moet tussen A en B gemerged worden. Elke user heeft in de database gewoon een ID (autonumber), waarmee ik de user aan andere zaken uit andere tabellen koppel (bijvoorbeeld user 1 hoort bij groep X en Y, dat wordt dus gekoppeld via UserId en GroupId zoals gewoonlijk). Het probleem lijkt me nu duidelijk: Piet heeft een account op website A en op website B, maar die accounts zijn helemaal los van elkaar en hebben dus een ander ID. Als ik nu de tabellen gewoon blind zou mergen dan raakt Piet dus de helft van zijn data kwijt (afhankelijk of hij het ID uit database A of uit database B krijgt), de koppeling raakt verloren omdat de IDs niet meer kloppen.
Gelukkig is er ook goed nieuws: elk account in de users tabel (in beide databases) heeft verplicht nog een ander numeriek ID (dit is een ID van een andere website die niet binnen mijn controle valt, noem dit maar even ID2), en die is ook uniek per gebruiker. Op deze manier kan ik dus gebruikers van elkaar onderscheiden, ook al is er geen echte naam of geen email ingevuld, als ID2 gelijk is dan is het gegarandeerd dezelfde user.
Het is nu logisch om sowieso het niets-zeggende autonumber ID te laten vervallen en gewoon dit ID2 als unieke key te gebruiken per user. Dat heb ik eerder niet gedaan omdat mijn ORM dat lastig maakte, maar dat mag nu geen excuus zijn natuurlijk.
Ik vraag me eigenlijk af wat hier nu de mogelijkheden zijn. Ik kan vast wel een (aantal) queries verzinnen om de users tabellen met elkaar te mergen op ID2, maar dan raak ik dus nog steeds de koppeling met andere tabellen kwijt. Hoe zorg ik er nu voor dat ik deze koppeling kan behouden? Is hier een goeie strategie voor of wordt dit een drama? Moet ik "handmatig" (via queries) alle ID koppelingen gaan vervangen ofzo?