pgv_name
Beschreibung
In dieser Tabelle werden die Namen der einzelnen Personen gespeichert. Dies kann nicht beim Individium geschehen, da es auch mehrere Schreibweisen von einer Person.
Struktur
Attribut | Nullable? | Datentyp |
---|---|---|
n_file | Nein | smallint(5) unsigned |
n_id | Nein | varchar(20) |
n_num | Nein | int(11) |
n_type | Nein | varchar(15) |
n_sort | Nein | varchar(255) |
n_full | Nein | varchar(255) |
n_list | Nein | varchar(255) |
n_surname | Ja | varchar(255) |
n_surn | Ja | varchar(255) |
n_givn | Ja | varchar(255) |
n_soundex_givn_std | Ja | varchar(255) |
n_soundex_surn_std | Ja | varchar(255) |
n_soundex_givn_dm | Ja | varchar(255) |
n_soundex_surn_dm | Ja | varchar(255) |
Indizes
Name | Typ | Attribute |
---|---|---|
PRIMARY | Primary | n_id n_file n_num |
pgv_name_file | Index | n_file |
Anmerkungen
Meines Erachtens ist der Indizes pgv_name_file zusätzlich zum PRIMARY überflüssig:
- Ein Zugriff mit nur einer bekannter GEDCOM-Datei kann ich mir als Löschen einer Datei vorstellen (und das gehört durch langsame Performance bestraft) und da meistens nur eine geringe Anzahl von Dateien existieren, wird sowieso ein (sogenannter) Full-Table-Scan verwendet.
Das diese Tabelle die längste Liste von kritischen Langläufern hat, wundert nicht, da der Name nun das häufigste Zugriffsmittel für den Anwender ist.
Dabei ist nicht zu verhindern, dass die Datenbanksysteme diese Abfrage nicht mit einem Index unterstützen können, da der Name nicht vom Anfang des Feldes sondern auch mitten im Feld gesucht wird.
Langläufer
SELECT n_givn, COUNT(*) AS num
FROM pgv_name JOIN pgv_individuals ON (n_id=i_id AND n_file=i_file)
WHERE n_file=<Angabe Gedcom-Datei>
AND n_type!='_MARNM'
AND n_givn NOT IN ('@P.N.', '')
AND LENGTH(n_givn)>1
AND i_sex='<Angabe Geschlecht>'
GROUP BY n_id, n_givn
;
Diese Query hat eine lange Verarbeitungszeit, da die vielen Datensätze auf der Platte sortiert werden müssen. Fraglich ist aber auch, warum die Vornamen pro Individuum (group by n_id, n_givn) gezählt werden.
SELECT DISTINCT n_surn, n_surname, n_id
FROM pgv_individuals JOIN pgv_name ON (i_id=n_id AND i_file=n_file)
WHERE n_file=<Angabe Gedcom-Datei>
AND n_type!='_MARNM'
AND (n_sort COLLATE utf8_unicode_ci LIKE '<Suchbegriff Nachname>,%')
ORDER BY n_sort
;
SELECT COUNT(n_surname) AS count, n_surn
FROM pgv_name
WHERE n_file=1
AND n_type!='_MARNM'
AND n_surn NOT IN ('@N.N.', '', '?', 'UNKNOWN')
GROUP BY n_surn ORDER BY count DESC LIMIT 0, 10
;
SELECT SUBSTR(n_sort COLLATE utf8_unicode_ci, 1, 1) AS alpha
FROM pgv_name, pgv_individuals, pgv_link
WHERE n_file=1
AND i_file=n_file
AND i_id=n_id
AND l_file=n_file
AND l_from=n_id
AND l_type='FAMS'
GROUP BY 1
ORDER BY 1
;
SELECT SUBSTR(n_sort COLLATE utf8_unicode_ci, 1, 1) AS alpha
FROM pgv_name, pgv_individuals, pgv_link
WHERE n_file=1
AND i_file=n_file
AND i_id=n_id
AND l_file=n_file
AND l_from=n_id
AND l_type='FAMS'
GROUP BY 1
ORDER BY 1
;
Die Abfrage erstellt die Liste des ersten Buchstaben der Nachnamen.
SELECT DISTINCT 'FAM' AS type, f_id AS xref, f_file AS ged_id, f_gedcom AS gedrec, f_husb, f_wife, f_chil, f_numchil
FROM pgv_families LEFT OUTER JOIN pgv_name husb ON f_husb=husb.n_id AND f_file=husb.n_file
LEFT OUTER JOIN pgv_name wife ON f_wife=wife.n_id AND f_file=wife.n_file
WHERE ((husb.n_full LIKE '%<Nachname>%' OR wife.n_full LIKE '%<Nachname>%'))
AND f_file IN (1,2,3)
ORDER BY ged_id
;
Diese Abfrage kann man nicht mehr optimieren, da die Nachnamen mit den Wildcardzeichen vorne (und hinten) gesucht werden (%<Nachname>%).