MySQL e genealogia

MarcoGrazia

Utente Attivo
15 Dic 2009
852
20
28
62
Udine
www.stilisticamente.com
Salve ragazzi, dovrei creare un programma di genealogia, quindi un database che tenga conto degli ascendenti e dei discendenti di una famiglia, compresi i rami collaterali.
Ora il mio tallone d'Achille è proprio che io con gli alberi in informatica non ci ragiono.
Sto iniziando a creare il programma d'interfaccia e mi serve una base da cui partire col database.
Ho pensato ad una tabella "Persona" strutturata come di seguito:
Codice:
CREATE TABLE `persona` (
  `id_persona` int(10) UNSIGNED NOT NULL,
  `id_account` int(10) UNSIGNED NOT NULL,
  `nome` varchar(256) NOT NULL,
  `cognome` varchar(256) NOT NULL,
  `sesso` tinyint(3) UNSIGNED NOT NULL COMMENT '0=sconosciuto, 1=maschio, 2=femmina',
  `data_nascita` date DEFAULT NULL,
  `data_morte` date DEFAULT NULL,
  `data_matrimonio` date DEFAULT NULL,
  `luogo_nascita` varchar(1024) DEFAULT NULL COMMENT 'Città, nazione',
  `luogo_morte` varchar(1024) DEFAULT NULL COMMENT 'Città, nazione',
  `luogo_matrimonio` varchar(1024) DEFAULT NULL COMMENT 'Città,nazione',
  `note` varchar(4096) DEFAULT NULL,
  `id_madre` int(10) UNSIGNED DEFAULT NULL,
  `id_padre` int(10) UNSIGNED DEFAULT NULL,
  `id_figlio` int(10) UNSIGNED DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='Tabella contenente i dati della persona';
Dove molti dati sono dati per null, dato che possono essere mancanti, ma non è questo il punto.
  • id_persona è l'identificativo di record di questa tabella ( indicizzata e autoincrementante )
  • id_account proviene dalla scheda personale, cioè chi compila l'albero, per identificarne un prorpietario;
  • gli altri dati sono identificata la persona a cui il record è riferito;
  • id_padre, id_madre e id_figlio, sono riferiti ai genitori e ai figli; ovviamente a null perché potrei non avere i dati e non avere discendenza.
Dato che come dicevo di alberi non ne capisco molto, inserendo un dato, per esempio pippo de pippis, con figlio 1 ( riferimento al record del figlio ma non ancora inserito di fatto nel database ) come funge?
Ovvero, quando vado a inserire la tabella per il figlio, metto come riferimento al padre l'id_persona.
Insomma una procedura che non è possibile realizzare a mano, credo servano le foreign key.
Mi date una mano?

PS: Forse andava in database->MySQL :D
 
Ultima modifica:

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
Ciao, tempo fa ho fatto un lavoro per un sito dove ogni utente poteva creare altri utenti, si è creato cosi un albero genealogico.
Ho creato semplicemente una tabella con due campi ( idUtente e idParent ) dove chi creava l'utente era il parent.
Con delle funzioni ricorsive salivo e scendevo dall'albero. Per recuperare il capostipite mi sono fatto aiutare dal forum in questa discussione.
Quando veniva creato un utente avevo in sessione l'id parent e l'id del nuovo utente lo recuperavo con insert_id di mysqli, tutto in php.
Il tuo lavoro è un pò più complesso ma penso che ragionandoci un pò potresti usare la stessa logica.
 

MarcoGrazia

Utente Attivo
15 Dic 2009
852
20
28
62
Udine
www.stilisticamente.com
Sto studiando sia chiaro :D
Allora, sto studiando gli alberi a insiemi annidati, forse la forma più nota di struttura ad albero, in pratica una tabella potremme avere la seguente struttura:
Codice:
CREATE TABLE `Note` (
  `id_nota` int(10) UNSIGNED NOT NULL,
  `nsleft` int(10) UNSIGNED NOT NULL,
  `nsright` int(10) UNSIGNED NOT NULL,
  `id_account` int(10) UNSIGNED NOT NULL,
  `nota` varchar(1000) NOT NULL,
  FOREIGN KEY ('id_account') REFERENCES 'Accounts' ('id_account')
);
Cioè il sistema classico dei commenti di un sistema a thread come questo forum, dove id_account ( registrato nella tabella Accounts ) scrive una nota.
Poi un altro id_account scrive un commento, e così ancora.
Ci possono essere dei forks ai commenti, per questo ci sono i campi nsleft ed nsright, a secondo di dove va il fork, a sinistra o a destra.
Ogni record rappresenta un nodo.
Diventa facile anche percorrere i nodi di un ramo, ad esempio con la seguente query:
Codice:
SELECT c2.* FROM Note AS c1 JOIN Note AS c2 ON c2.nsleft BETWEEN c1.nsleft AND c1.nsright WHERE c1.id_nota = 4;
Dove 4 è un riferimento alla nota 4 ovviamente; la SELECT mi ritorna tutti i nodi compresi tra la 4 e l'ultimo discendente.
Anzi con poche query dovrebbe essere facile, dato un nodo, salire o scendere per leggere genitori e figli.
Inoltre, leggendo varie pubblicazioni, cartacee, comprendo pure che eliminando un nodo arbitario, non c'è poi bisogno di ricompattare il database, perché non c'è gerarchia tra i nodi, ma solo riferimenti ai nodi stessi, se uno manca viene saltato. Mi fido ma ancora non ho realizzato prove, vedremo come funziona più avanti...
Invece pare che i problemi, ma relativi alla complessità delle query, sussistano solo quando si vuole inserire un nodo in mezzo ad altri nodi, perché qui bisogna ricalcolare tutti i valori nsleft ed nsright.
Studio ancora.
 
Discussioni simili
Autore Titolo Forum Risposte Data
K form Inserimento record mysql PHP 2
P Mysql lento a cancellare MySQL 1
P Codifica caratteri speciali mysql php PHP 0
N MAX() + ADD_DATE - per update su Mysql MySQL 0
F Applicazione PHP/MySQL per prenotazioni: limitare il numero massimo di posti prenotabili PHP 20
L tipo boolean non funzionante su mariadb (mysql). E codice php 7.4. PHP 0
M PHP/MySQL - Estrarre valori min e max di ogni gruppo PHP 5
W MySQL ciclo in SELECT MySQL 0
L Mysql gestionale multipiattaforma MySQL 0
W MySQL SELECT list dinamica MySQL 0
M utilizzo mysql in nodejs - crea createdAt e updateAt MySQL 1
T colonne di tabelle mysql ordinate MySQL 0
M Sintassi "personalizzata" per mysql workbench? MySQL 0
A Mysql MySQL 0
F Ricreare struttura php+mysql su Xampp Apache 0
M Array associativi php su 2 campi mysql PHP 10
Z Controllo giorni MYSQL PHP 0
L php mysql non salva solo id PHP 21
L php mysql cerca e visualizza pagina PHP 0
L Mysql: Nascondere le pagine dopo una ricerca PHP 1
R Aggiornare record mysql con Ajax, jQuery e php Ajax 2
S problema con recupero dati tabella mysql PHP 2
E Progressbar estrazione dati da tabella mySQL Ajax 9
Z MySql injection PHP PHP 1
D controllare valore in tabella mysql PHP 0
A pulsante di update campo mysql con javascript Javascript 2
R Tutto su utf-8 ma ancora problemi con i caratteri speciali in mysql MySQL 1
T differenza fra mysql xampp e un mysql server Database 0
R Importazione csv su mysql tramite array PHP 2
Z Problema con INT MySQL PHP 1
Z Problema database MySQL con XAMPP PHP 0
D problema php mysql PHP 1
D problema php mysql PHP 1
N Server mysql non raggiungibile da connessione esterna MySQL 1
B Crea pdf da tabella mysql "ultima riga modificata" MySQL 4
D evitare di inserirre duplicati in mysql PHP 4
L salvare codice html in mysql PHP 3
L Google chart php mysql PHP 2
S Gestire scelta dropdown con dati da Mysql PHP 2
K cron job mysql PHP 3
elpirata Query per leggere dati da una tabella mysql e mostrarli a video in base a parametri passati tramite GET PHP 5
R Errore UPDATE tabella mysql PHP 1
R Caricamento immagine su cartella remota + mysql PHP 3
D Emoji in mysql Database 0
L Aiuto per programma web php/mySQL PHP 2
S Problema esportazione tabelle Mysql in Excel PHP 0
S Cancellare una riga MYSQL PHP 1
L Ricerca valore mysql e incremento PHP 73
G database mysql contengono informazioni ? MySQL 0
G Testo in mysql format 3 MySQL 0

Discussioni simili