Impressum   

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

AttributNullable?Datentyp
n_fileNeinsmallint(5) unsigned
n_idNeinvarchar(20)
n_numNeinint(11)
n_typeNeinvarchar(15)
n_sortNeinvarchar(255)
n_fullNeinvarchar(255)
n_listNeinvarchar(255)
n_surnameJavarchar(255)
n_surnJavarchar(255)
n_givnJavarchar(255)
n_soundex_givn_stdJavarchar(255)
n_soundex_surn_stdJavarchar(255)
n_soundex_givn_dmJavarchar(255)
n_soundex_surn_dmJavarchar(255)

Indizes

NameTypAttribute
PRIMARYPrimaryn_id
n_file
n_num
pgv_name_fileIndexn_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>%).