[MSSQL] Trigger einrichten

Bevor ich was beweise, doofe Frage, verletze ich die 1. NF eigentlich überhaupt?
Ist ja sehr lange her bei mir, aber heißt 1 .NF nicht, das ich ich der DB keine Redundanten Daten habe?
Habe ich redundante Daten?
Deshalb hatte ich den Wikipedia-Artikel in einer meiner Antworten verlinkt... ;)

"Alle Attribute enthalten atomare Inhalte, und die Relation hat eine feste Breite."
 
Ja das habe ich übersehen, aber ich habe das irgendwie nie so richtig verstanden auch wenn ich das zumindest in den Klausuren richtig gemacht habe und wohl sonst auch bisher, nur halt bei dem Fall ist das so eine Sache, weil ich der Meinung halt bin, das es hier deutliche Vorteile gibt.

1. Wie ja schon festgestellt ist das hinzufügen einer Spalte schneller als von X Zeilen
:arrow: https://www.klamm.de/forum/f28/mssql-trigger-einrichten-413507.html#post7096322

2. Es können unterschiedliche Datentypen verwendet werden.

3. Das Selectieren von Daten ist durch weniger Spalten schneller (oder etwa nicht?)

4. Update von zwei Spalten mit einer Wherebedingung in einer Abfrage statt in 2 Anweisungen.

Das sind die Vorteile die ich darin sehe. Und ich sehe nur den Nachteil das es nicht in der 1. NF also dann ist.
 
warum musst du den wert in y tausend zeilen einfügen? meine du hast da dann doch eh den "default" wert da kannst es dir auch sparen den überall Einzutragen.

Beim Selectieren stellt sich mir erstmal die Frage wie 90% deiner Abfragen überhapt aussehen.
fragst du eher nur die Werte eines Benutzers ab oder wird meistens auf "mehrere" Benutzer zugegriffen?
Desweiteren wie häufig kommt ein Insert in die Währungstabelle überhaupt vor?
Und wie löst du das im Code meine du müsstest ja jedesmal all deine Funktionen umschreiben damit die wieder alle spalten bekommen.
Wäre mir viel zu aufwendig xDD

Beispiel Abfragen alle Kontostände eines bestimmten Benutzers mit Währungsname

Dein Design:
PHP:
$w_query=mysql_query("SELECT id, name FROM waehrung ORDER BY id");
while(($row=mysql_fetch_assoc($w_query)){
  $waehrungen[$row['id']=$row['name'];
}

$konto=mysql_fetch_assoc(mysql_query("SELECT * FROM Konto WHERE uid=1"));
$w=1;
//geht nur wenn Währungsliste ohne Loch
while(key_exists($konto['w'.$w])){
  show($konto['w'.$w], $waehrung['id']);
  $w++;
}

Design in NF
PHP:
$w_query=mysql_query("SELECT 
  k.konto AS konto,
  w.name AS name 
FROM konto AS k 
LEFT JOIN   waehrung AS w 
ON k.wid=w.id 
WHERE uid=1;");
while(($row=mysql_fetch_assoc($w_query)){
  show($row['konto'], $row['name']
}

Alleine die Tatsache das du immer 2 Querys machen musst zum auslesen dürfte dein Design schon deutlich langsamer als das in NF machen.
 
wenn ich die Zeilen nicht einfüge, dann muss ich ja jedesmal prüfen ob es die gibt wenn nicht dann anlegen.
in mssql gibt es ja auch nicht update on duplicate entry oder wie das nochmal bei mysql heißt.

also es wird sowohl abfragen pro user als auch insgesamt geben. und die abfrage der währungen kann man auch so lösen, das dies einmalig erfolgt und das für alle user zu gleich. was wohl auch sinnvoll sein wird, da dort werte drin stehen, die öfters gebraucht werden.

So das nur eine Zeile "immer" abgerufen wird.

den Code kann man so gestallten, dass man den egal wieviele Währungen sind nicht geändert werden müssen.
1. Konto abrufen
2. Währungen durchlaufen.

Also reihenfolge bei deinem Code ändern. Brauchst nur eine Schleife dann.
 
den Code kann man so gestallten, dass man den egal wieviele Währungen sind nicht geändert werden müssen.
1. Konto abrufen
2. Währungen durchlaufen.

Genau 2 Querys diese sind garantiert langsamer als einer den du noch daz als View speichern kannst und der damit gecachted werden kann.

Desweiteren wie gehst du mit den "löchern" um?
Okay du köntest was bauen mit keys und dann über die iterieren. Komplexität zum durchlaufen aller Felder ist dann O(2n) (interne Prüfungen ob der key im Array überhaupt existiert usw sind mal nicht beachtet) (Das normale Iterieren liegt in Θ(n))

Aber deiner DB wird dann trotzdem langweilig :ugly: klar die DB sollte keine "Berechnungen" drchführen. Aber normalerweise sind DBMS daraf asgelegt möglichst effizient Daten abzurufen. Und das auch mit Ausschnitten und sortierten Daten oder verknüpften.

Also solltest du es jemals schneller einen JOIN zu bauen der schneller ist als das z.T. gecachte Ergebnis der DBMS dann lass dir das Verfahren auf jeden Fall patentieren :ugly:

Das einzigste Perfomanceloch das bei mehreren Spalten entstehen könnte wäre wenn du als Tabellenengine MyISAM verwendest und jedesmal sehr große Datenblöcke änderst und/oder sehr aufwendige Transaktionen durchführst. Dann wird durch das Tabellenweite Locking wahrscheinlich dein gesamtes Programm für die Zeit der Transaktion gesperrt. Aber da sorgt schon INNODB für Abhilfe.
 
Es wäre quasi nur Konto abrufen, denn die Währungen werden nur einmalig dann beim Applikationsstart abgerufen und dann "nicht nochmal".

Wieso Löcher?
O(2n)?
Ich iteriere nur einmal alle Währungen durch, wenn ich alle anzeigen will. Und sonst brauche ich nicht mal Iterieren, wenn ich weiß welchen einen ich Zeigen will.

MyIsam und innodb sind doch mysql? Geht aber um MSSQL.

Wie gesagt ich mache gar keinen Join. Der ist nicht nötig.