Abbiamo un database piuttosto antiquato che contiene un gran numero di individui insieme a una serie di risultati che hanno completato. Storicamente si è fatto poco per scoraggiare i dati individuali duplicati, quindi siamo finiti in una situazione in cui i nostri dati sono piuttosto sporchi. Una versione estremamente semplificata di questo può essere trovato here.Schema di schema dello schema del database per i dati che si fondono
Ora stiamo ridisegnando lo schema e l'interfaccia utente. Forniremo all'utente uno strumento per unire le persone. Nell'esempio fornito, Dave e David sono chiaramente la stessa persona e hanno raggiunto 4 risultati in totale.
Dato che gli utenti commettono errori e che sono coinvolte molte più tabelle rispetto all'esempio, sto cercando un modello di schema che faciliti la fusione dei dati e, in particolare, lo smantellamento dei dati se (quando!) l'utente fa inevitabilmente un errore.
Gli elenchi collegati di qualche tipo sembrano essere una soluzione ma non sono esattamente efficienti per questo caso d'uso. Ci sono altri concetti che potrebbero prestarsi a questa situazione? Eventuali modelli di progettazione specifici che potrebbero essere appropriati?
Edit: come si sta piuttosto traballante SQLFiddle oggi ecco il creare/inserire/select sql che era sul sqlfiddle:
CREATE TABLE individual
(`individual_id` int, `forename` varchar(50), `surname` varchar(50))
;
CREATE TABLE achievement
(`achievement_id` int, `name` varchar(50), `description` varchar(50))
;
CREATE TABLE individual_achievement
(`individual_id` int,`achievement_id` int)
;
INSERT INTO individual
(`individual_id`, `forename`, `surname`)
VALUES
(1, 'Dave', 'Deane'),
(2, 'David', 'Deane')
;
INSERT INTO achievement
(`achievement_id`, `name`, `description`)
VALUES
(1, 'unit_1', 'Unit 1'),
(2, 'unit_2', 'Unit 2'),
(3, 'unit_3', 'Unit 3'),
(4, 'unit_4', 'Unit 4')
;
INSERT INTO individual_achievement
(`individual_id`,`achievement_id`)
VALUES
(1, 1),
(1, 3),
(2, 2),
(2, 4)
;
select * from individual i
join individual_achievement ai using (individual_id)
join achievement a using (achievement_id)
Edit 2: appena trovato questo very similar question, sperando in 4 anni lì potrebbe anche altre soluzioni.
Impossibile vedere SQLFiddle, ma perché non si fondono automaticamente gli obiettivi piuttosto che gli utenti di lettere lo fanno? – plalx
Domanda ragionevole @plalx.Non abbiamo abbastanza informazioni a nostra disposizione per poter rilevare in modo affidabile i duplicati. Ci sono molti casi in cui abbiamo solo nomi e cognomi su cui non è assolutamente sufficiente. in molti casi abbiamo una data di nascita, ma anche in questo caso esiste la possibilità che ciò sia sbagliato. Il nostro piano è quello di evidenziare all'utente quelli che pensiamo potrebbero essere duplicati, ma solo l'utente saprà con certezza se i suoi individui sono duplicati o meno. –