ruben: MySQL optimal benutzen

Beitrag lesen

das ist in meinen Augen suboptimal.
Ändere Deine Einstellung - und mach es bestenfalls umgekehrt.

Ich fürchte, ich habe die Datenbanksituation wirklich nicht ausreichend dargestellt. Ich bin mir aber sicher. Soweit ich deine Ausführungen bisher verstehe, will ich wirklich keine Kaskaden sondern Trigger (gibt es die auch für MyISAM-Tabellen)?

Wenn eine Sprache gelöscht wird, dann soll es auch keine Vokabeln dieser Sprache
mehr geben. Die Stichworte dazu wurden bereits genannt: Referentielle Integrität
durchsetzbar mit

ON DELETE CASCADE

bei MySQL nur bei Verwendung der InnoDB-Engine.

Willst Du Deine derzeitige Strategie beibehalten, so kannst Du dies
datenbankseitig mit Triggern erledigen. Diese übernehmen die Prüfung, die Du
derzeit in der API machst und löschen gegebenenfalls die Sprache aus der zweiten
Tabelle.

Die möchte ich beibehalten, ich illustriere warum an folgendem Beispiel.

Nein, dies ist meiner Meinung nach keine gute Idee und erst recht nicht "optimal".
Eine Sprache hat meiner Meinung nach nichts damit zu tun, ob Vokabeln, Wörter
dazu abgespeichert sind. Umgekehrt solltest Du erst Vokabeln einer Sprache
abspeichern, nachdem Du diese Sprache angelegt hast. Deine
Spaltenbezeichnungen lassen (möglicherweise zu Unrecht) auf eine suboptimale
Tabellenstruktur schließen. Ohne ein paar Beispieldatensätze, insbesondere
auch mit den vokabel- und sprachenspezifischen Feldern läßt sich das aber
nicht endgültig beurteilen.

Ich hoffe, so wird es klarer (ich hielt diese Informationen für redundant):
CREATE TABLE vokabeln (
  id int(5) unsigned NOT NULL auto_increment,
  user varchar(255) NOT NULL default '',
  sprache varchar(255) NOT NULL default '',
  bekannt text NOT NULL,
  fremd text NOT NULL,
  hinweis text NOT NULL,
  phase tinyint(2) unsigned NOT NULL default '0',
  zeit int(8) unsigned NOT NULL default '0',
  PRIMARY KEY  (id)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=10449 ;

--
-- Daten für Tabelle vokabeln
--
INSERT INTO vokabeln VALUES (1, 'ruben', 'SCHWEDISCH', 'trinken', 'dricka', '', 5, 20060218);
INSERT INTO vokabeln VALUES (23, 'ruben', 'SCHWEDISCH', 'Die Sonne scheint.', 'Solen skiner.', '', 5, 20060218);
INSERT INTO vokabeln VALUES (121, 'ruben', 'SPANISCH', 'gelb', 'amarillo', '', 5, 19700101);
INSERT INTO vokabeln VALUES (710, 'ruben', 'ENGLISCH', 'sich erfreuen/ergötzen', 'to regale', '', 5, 20061220);
CREATE TABLE sprachen (
  nutzer varchar(255) NOT NULL default '',
  sprache varchar(255) NOT NULL default '',
  zeichen varchar(255) NOT NULL default '',
  abfrage tinyint(1) NOT NULL default '0'
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
--
-- Daten für Tabelle sprachen
--
INSERT INTO sprachen VALUES ('ruben', 'englisch', 'x y z', 1);
INSERT INTO sprachen VALUES ('ruben', 'franzoesisch', 'ï œ æ ë', 1);
Soweit so simpel.
Der Knackpunkt ist aber eigentlich der:
Man fügt beständig neue Vokabeln hinzu, und wählt für die neuen Datensätze entweder eine der bereits vertretenen Sprachen oder eine neue.
Wenn man die Sprache löschen will, kann man alle Vokabeln dieser Sprache löschen (das halte ich für besser, da man es selten will).
Du kannst es dir live in der genannten URL ansehen, das ist aber nicht die Version an der ich arbeite. Dort sind Sprachen und Vokabeln vollkommen unabhängig voneinander (eine sehr nervige Lösung).
Ich bin mir auf jeden Fall sehr sicher, dass meine Lösung für meinen Fall die bessere ist. Wenn du dir die Seite ansiehst, verstehst du es auch; gibt es dafür keine Zeit; dann nimm mein Wort dafür.
Schönen Gruß und vielen Dank für die hilfreichen Stichworte,
Ruben (in Eile…)