Zitat:
Zitat von Peh4pe
Eher unverständlich formuliert..
also es Darf sein, dass Titel und Location gleich sind.. wenn dazu noch die description gleich wäre, wäre es eine dublette.
...
Mein Bedenken ist nur, dass so wie ich es aktuell prüfen will (mit dem $rowcheck) wahrscheinlich sehr unperformant sein wird?
|
Erstmal solltest du es ausprobieren, sprich: messen. Dann kannst du versuchen, die Geschwindigkeit zu steigern, falls nötig.
Alle deine Vorschläge|Ideen|gelesenen Tricks lassen sich kombinieren.
Um einen sehr langen Text mit einer Liste von sehr langen Texten effizient zu vergleichen, geht man in der Reihenfolge vom geringsten zum höchsten Aufwand vor:
1.) Länge vergleichen. Sind die Texte nicht gleich lang, sind sie auch nicht gleich.
2.)
Prüfsumme|Hash-Wert oder ähnliches berechnen und vergleichen. Sind sie unterschiedlich, sind es auch die Texte. Hier musst du beachten, dass die verwendete Hash-Funktion über den gesamten Text läuft.
3.) Schließlich der mühsame Vergleich des Volltextes. Hier hilft die Datenbank, wenn sie entsprechende Indizes erstellen kann. Dann werden die Texte quasi vorsortiert und der Vergleich kann effizienter erfolgen. Im komfortabelsten Fall hat die entsprechende Spalte in der Tabelle den Constraint UNIQUE, so dass die Datenbank schon beim Einfügen eines neuen Datensatzes bescheid geben kann. Wie sich MySQL hier anstellt, musst du allerdings selbst rausfinden ... Dieses Gewürge mit den unterschiedlichen String|Text-Typen; die sich in Verbindung mit den unterschiedlichen Storage-Engine-Typen unterschiedlich verhalten, würde ich mir nur ungern antun.
Ein Problem mit Dubletten-Erkennung von Texten ist allerdings, dass Texte, die (in der Rohfassung) für Maschinen ungleich sind, für menschliche Betrachter trotzdem gleich "aussehen" können. Dann müssen alle drei Vergleichsstufen daran angepasst werden. Also bspw.:
1.) Länge: Nicht nur Bytes zählen, sondern nur Nicht-Whitespace-Zeichen.
2.)
Prüfsumme|Hash-Wert: Groß-Klein-Schreibung, Whitespace usw. ignorieren.
3.) Volltextvergleich: wie 2.
--
Gemecker zum Schluss: Verwende PDO oder mysqli und
binde Benutzereingaben als Parameter an Prepared Statements (
siehe auch). Wenn du die ungeprüft mit SQL-Syntax zusammenklebst, musst du dir keine Sorgen um Effizienz machen, weil du dir vorher
größere Probleme einhandelst.