Hallo Forum,
Tabelle filter_words
word VARBINARY(50)
-- Es ist gute Praxis, SQL-Schlüsselwörter groß zu schreiben, siehe z.B.
-- MySQL-Handbuch
Ich mag diese Praxis nicht, ich habe die ganze Zeit das Gefühl, dass meine SQL-Statements mich anschreien.
-- Warum ausgerechnet VARBINARY, warum genau dieser Datentyp.
Weil der Fall relevant ist, wenn ich varchar nehme kann ich nicht "Foo" und "foo" gleichzeitig in der Tabelle speichern.
-- Begründe die 50.
Relativ großes Maximum, mit dem man herumexperimentieren kann.
-- die Angabe der Storage-Engine ist überflüssig, oder hast Du bestimmte
-- Gründe ausgerechnet MyIsam zu verwenden?
Ja, Performance. In meiner MySQL-Installation ist InnoDB voreingestellt, ich brauche aber weder Transaktionen noch referentielle Integrität, auch nicht wenn mehrere Benutzer gleichzeitig Trainingsdaten einfügen.
Tabelle filter_stats
Du schreibst in Deiner Signatur, dass Deine Klasse Texte kategorisieren
kann. Darunter verstehe ich eine beliebige Anzahl von Kategorien. Deine
Tabelle spiegelt das nicht wieder. Eine neue Kategorie bedeutet bei Dir
eine neue Spalte. Das ist normalerweise ein Anzeichen eines ungünstig
gewählten Tabellendesigns.
Das ist mir bewusst, aber die Spamfilter-Klasse ist nicht die Text-Kategorisierer-Klasse.
Der Text-Kategorisierer entstand bevor ich den Satz von Bayes anwenden konnte und verwendet ein krudes mathematisches Konstrukt, das in der nächsten Version ersetzt wird und kann beliebig viele Kategorien ohne Änderung der Tabellen verwalten, erzeugt aber ziemlich viel overhead.
Der Spamfilter kann nur zwei Kategorien, aber dafür verbraucht er auch relativ wenig Speicherplatz.
Dann füllst Du sie mit zwei Datensätzen. Viel einfacher hättest Du einfach
den Initialinhalt der Tabelle hingeschrieben. Einfacher, verständlicher.
Bei Deinem Design ist zudem der Spaltenname "name" ungünstig, weil
aussagelos, gewählt. Inkonsequent und inkonsistent die beiden Datensätze:"lnum" ist der (natürliche) Logarithmus der Anzahl der Kommentare
"lwords" ist der (natürliche) Logarithmus der Anzahl der WörterFällt Dir etwas auf? Welchen Eintrag solltest Du treffender wählen?
Inkonsequent der Datentyp: CHAR(5) wäre ausreichend und würde zudem
Datensätze fester Länge ermöglichen, aber das nur am Rande.
In dieser Tabelle sind Zeit ihres Lebens nur diese beiden Datensätze, die halt die Anzahl Wörter und die Anzahl Texte speichern. Wo genau ist jetzt das Problem?
Wenn Du die Tabelle transponierst, dann werden daraus Spaltenüberschriften
und Du brauchst Dir keinen Gedanken über einen beschreibenderen Namen zu
machen :-) Ich weiß, dass das Konsequenzen für Deine ganze Klasse hat,
aber das sollte machbar sein.
Meinst du so eine Tabelle für die Statistiken?
create table filter_stats (
id integer undigned auto_increment primary key,
category varchar(10) not null unique,
lnum float default 0,
lwords float default 0
);
Dein PHP-Code ist im Archiv, warum nicht auch Deine SQL-Statements?
Die SQL-Statements sind im PHP-Code bzw. werden von ihm zusammengebaut, wozu brauche ich da noch gesonderte SQL-Statements?
Ich hoffe, ich konnte Dir einige Anregungen geben, durch deren Umsetzung
Dein Artikel zugänglicher wird - und somit auch Beachtung finden wird. Das
hast Du sicherlich auch verdient.
Deine Ausführungen zum Aufbau des Artikels werde ich zu Hause nochmal in aller Ruhe durchgehen und den Artikel überarbeiten.
Gruß
Alexander Brock