php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 17-09-2009, 21:30
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Lightbulb [gelöst] BCNF-Verletzung durch nichttriviale Abhängigkeit

Hallo liebe Experten,

ich stehe vor folgender Frage: sollte ich die BCNF verletzen, wenn die funktionale Abhängigkeit zu komplex ist, um sie bei der Abfrage als triviale Where-Klausel zu formulieren?

Die betreffende Relation ist ein Anrufer:

Code:
id
form_of_address_fkey => form_of_address.id (Anrede: Frau/Herr)
address_fkey         => address.id
phone_number_fkey    => phone_number.id
first_name
last_name
company_name
title                (akad. Titel, z. B. "Prof. Dr.")
is_distinguishable   (siehe unten)
Das Attribut is_distinguishable speichert, ob der Anrufer anhand der aufgenommenen Informationen beim nächsten Anruf relativ eindeutig wiedererkennbar ist. Diese Bedingung soll als erfüllt gelten, wenn mindestens
a) address_fkey oder
b) phone_number_fkey oder
c) zwei der Attribute { first_name; last_name; company_name; title }
gesetzt sind.

Damit ist das Attribut is_distinguishable zwar funktional von allen anderen abhängig und damit redundant, hat aber durchaus seine Berechtigung, denn die Where-Klausel würde über 3 Zeilen gehen und verlangsamt die Abfrage auch maßgeblich.

Was würdet ihr machen - das Attribut wegschmeißen und als Where-Klausel formulieren oder es benutzen und damit die BCNF verletzen?

Gruß,

Amica

Geändert von AmicaNoctis (17-09-2009 um 21:32 Uhr)
Mit Zitat antworten
  #2 (permalink)  
Alt 17-09-2009, 21:35
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von AmicaNoctis Beitrag anzeigen
[...] denn die Where-Klausel würde über 3 Zeilen gehen und verlangsamt die Abfrage auch maßgeblich.
Wie maßgeblich?

Sind für die einzelnen dabei betroffenen Spalten Indexe vergeben?

Zitat:
Was würdet ihr machen - das Attribut wegschmeißen und als Where-Klausel formulieren oder es benutzen und damit die BCNF verletzen?
Prinziell guten Gewissens letzteres - wenn mir die Umstände entsprechend gravierend erschienen. D.h., in einem komplexeren Fall schon, aber der hier vorliegende scheint mir noch nicht so "tragisch", dass eine Ermittlung über die WHERE-Klausel sich derart schmerzbar bei der Performance bemerkbar machen dürfte (bzw. müsste).
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #3 (permalink)  
Alt 17-09-2009, 23:04
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat von wahsaga Beitrag anzeigen
Wie maßgeblich?

Sind für die einzelnen dabei betroffenen Spalten Indexe vergeben?
Mit der komplexen Where-Klausel dauert es doppelt so lange wie mit "where is_distinguishable = true". Dabei ist es unerheblich, ob die Spalten indiziert sind oder nicht, da es ja nicht um konkrete Werte geht, sondern um die Tatsache, ob der Wert NULL bzw. leer ist.

(Ich hab es trotzdem erst ohne Indizes probiert und dann welche angelegt und nochmal getestet, gleiches Ergebnis.)

Amica
Mit Zitat antworten
  #4 (permalink)  
Alt 17-09-2009, 23:40
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von AmicaNoctis Beitrag anzeigen
Mit der komplexen Where-Klausel dauert es doppelt so lange wie mit "where is_distinguishable = true".
Naja, das doppelte von ein paar Millisekunden sind immer noch ein paar Millisekunden. Der Aufwand das Feld zu pflegen ist bestimmt größer wie diese eine Queryoptimierung.
Wieso ist form_of_address ein FKey und kein ENUM? Vielleicht bringt der Join weniger ja schon etwas mehr...
Mit Zitat antworten
  #5 (permalink)  
Alt 17-09-2009, 23:48
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat von PHP-Desaster Beitrag anzeigen
Naja, das doppelte von ein paar Millisekunden sind immer noch ein paar Millisekunden. Der Aufwand das Feld zu pflegen ist bestimmt größer wie diese eine Queryoptimierung.
Da hast du recht, also mach ich es normalisiert.

Zitat:
Zitat von PHP-Desaster Beitrag anzeigen
Wieso ist form_of_address ein FKey und kein ENUM?
Weil ENUMs nicht internationalisierbar sind.

Zitat:
Zitat von PHP-Desaster Beitrag anzeigen
Vielleicht bringt der Join weniger ja schon etwas mehr...
Das wird nicht gejoint. Die Anreden lädt der Client nur einmal und zeigt sie auf Basis des Schlüsselwertes mit einem speziellen ColumnRenderer an.

Danke für die Entscheidungshilfe!

Gruß,

Amica

Geändert von AmicaNoctis (17-09-2009 um 23:50 Uhr)
Mit Zitat antworten
  #6 (permalink)  
Alt 18-09-2009, 00:10
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von AmicaNoctis Beitrag anzeigen
Zitat:
Wieso ist form_of_address ein FKey und kein ENUM?
Weil ENUMs nicht internationalisierbar sind.
Doch - wenn man den nummerischen Wert zum Lookup in einer Tabelle nutzt, in der die lokalisierten Bezeichner abgelegt sind ;-)
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #7 (permalink)  
Alt 18-09-2009, 00:13
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat von wahsaga Beitrag anzeigen
Doch - wenn man den nummerischen Wert zum Lookup in einer Tabelle nutzt, in der die lokalisierten Bezeichner abgelegt sind ;-)
Und sowas nennt man dann Fremdschlüssel

OffTopic:
Zitat:
Zitat von wahsaga Beitrag anzeigen
in der die lokalisierten Bezeichner abgelegt sind
Nennt man das im Deutschen auch "lokalisiert"? Lokalisieren (Ort bestimmen) ist doch engl. locate und engl. localize (regional anpassen) ist das was ich als Internationalisierung kenne. Ist irgendein Sprachexperte da, um das zu klären?

Geändert von AmicaNoctis (18-09-2009 um 00:22 Uhr)
Mit Zitat antworten
  #8 (permalink)  
Alt 18-09-2009, 01:00
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von AmicaNoctis Beitrag anzeigen
Weil ENUMs nicht internationalisierbar sind.
Ok, das ist ein Argument. Aber wie sieht denn deine form_of_address-Tabelle aus? Wenn ich mich nicht irre hast du doch immer die Anrede Herr/Frau, oder sehe ich das falsch? Berücksichtigst du auch sowas umgangssprachliches wie "Miss" im Englischen?
Weil sonst zählt das Argument nicht. Ganz im Gegenteil, das wäre für mich sogar ein Gegenargument und die Übersetzung der ENUM-Werte Herr/Frau findet in der Applikation statt. Bin da aber nicht der Profi, klär mich doch mal auf
Mit Zitat antworten
  #9 (permalink)  
Alt 18-09-2009, 01:15
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Also das sieht mir doch sehr nach einer Reise nach Absurdistan aus.

Wenn ich das ENUM { Herr, Frau, Fräulein } in der Applikation übersetze, brauche ich eine wieder eine Tabelle. Woher kommt die? Richtig - aus der DB. Der Lookup erfolgt dabei dann über den ENUM-Wert, was hab ich dann? Richtig - nen Fremdschlüssel, nur dass der dann nicht einfach tinyint ist, sondern ENUM. Es läuft trotzdem immer auf einen Fremdschlüssel hinaus.

Daher die Frage: Wovon genau willst du mich jetzt überzeugen?

Gruß,

Amica
Mit Zitat antworten
  #10 (permalink)  
Alt 18-09-2009, 02:04
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von AmicaNoctis Beitrag anzeigen
Woher kommt die? Richtig - aus der DB. Der Lookup erfolgt dabei dann über den ENUM-Wert, was hab ich dann? Richtig - nen Fremdschlüssel, nur dass der dann nicht einfach tinyint ist, sondern ENUM. Es läuft trotzdem immer auf einen Fremdschlüssel hinaus.
Wenn du deine Übersetzungstexte in der Datenbank hast, kannst du es so machen. Aber du unterstützt damit ja nur eine Sprache oder sehe ich das falsch? Ich kann dir ehrlich gesagt nicht so ganz folgen wieso ich einen Verweis auf eine Extratabelle benötige. Nimm einen ENUM (Frau, Herr) und die Werte übersetzt du im Locale-Adapter, zum Beispiel mit einer MessageID "Anrede".ENUM_VALUE . Wo die Übersetzung letztenendes her kommt, ob da eine Datenbank oder ein gettext hintersteckt, sollte dir egal sein.

Geändert von PHP-Desaster (18-09-2009 um 02:07 Uhr)
Mit Zitat antworten
  #11 (permalink)  
Alt 18-09-2009, 04:26
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat von PHP-Desaster Beitrag anzeigen
Wenn du deine Übersetzungstexte in der Datenbank hast, kannst du es so machen. Aber du unterstützt damit ja nur eine Sprache oder sehe ich das falsch?
Wenn ich nur eine Sprache unterstützen würde, könnte man kaum von Übersetzungstexten sprechen.

Zitat:
Zitat von PHP-Desaster Beitrag anzeigen
Ich kann dir ehrlich gesagt nicht so ganz folgen wieso ich einen Verweis auf eine Extratabelle benötige.
Würde ein komplettes Beispiel helfen?

Code:
form_of_address
---------------
id
text_fkey => text.id


text
----
id


i18n_text
---------
id
language_fkey => language.id
text_fkey     => text.id
content


language
--------
id
iso_639_1_code
iso_639_2_code
iso_639_name
native_name_fkey => text.id


select f.id, i.content, l.iso_639_name
from form_of_address as f
join i18n_text as i on i.text_fkey = f.text_fkey
join language as l on l.id = i.language_fkey
where l.iso_639_2_code = 'swa' or l.iso_639_2_code = 'deu'
order by f.id, l.iso_639_2_code

+----+----------+--------------+
| id | content  | iso_639_name |
+----+----------+--------------+
|  1 | Herr     | German       |
|  1 | bwana    | Swahili      |
|  2 | Frau     | German       |
|  2 | bibi     | Swahili      |
|  3 | Fräulein | German       |
|  3 | bibi     | Swahili      |
+----+----------+--------------+

Zitat:
Zitat von PHP-Desaster Beitrag anzeigen
Nimm einen ENUM (Frau, Herr) und die Werte übersetzt du im Locale-Adapter, zum Beispiel mit einer MessageID "Anrede".ENUM_VALUE . Wo die Übersetzung letztenendes her kommt, ob da eine Datenbank oder ein gettext hintersteckt, sollte dir egal sein.
Warum sollte ich denn jetzt wieder alles über den Haufen werfen? Das ist ein konsequenter, absolut relational korrekter Ansatz, den ich seit Jahren erfolgreich verwende, wenn es um multilinguale Projekte geht. Meine Frage war ja eigentlich eine ganz andere und ich verstehe immer noch nicht, warum jetzt alle auf der Anrede rumhacken.

Gruß,

Amica

Geändert von AmicaNoctis (18-09-2009 um 12:48 Uhr)
Mit Zitat antworten
  #12 (permalink)  
Alt 18-09-2009, 09:22
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von AmicaNoctis Beitrag anzeigen
Würde ein komplettes Beispiel helfen?
Ja, vielen Dank, das hat sogar sehr geholfen. Werde dann jetzt auch nicht mehr drauf herumhacken
Mit Zitat antworten
  #13 (permalink)  
Alt 18-09-2009, 12:50
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat von PHP-Desaster Beitrag anzeigen
Ja, vielen Dank, das hat sogar sehr geholfen. Werde dann jetzt auch nicht mehr drauf herumhacken
Fein, na dann danke ebenfalls
Mit Zitat antworten
  #14 (permalink)  
Alt 19-09-2009, 09:49
Jester_Prince
 Registrierter Benutzer
Links : Onlinestatus : Jester_Prince ist offline
Registriert seit: Jul 2009
Ort: Berlin
Beiträge: 33
Jester_Prince befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von AmicaNoctis Beitrag anzeigen
Nennt man das im Deutschen auch "lokalisiert"? Lokalisieren (Ort bestimmen) ist doch engl. locate und engl. localize (regional anpassen) ist das was ich als Internationalisierung kenne. Ist irgendein Sprachexperte da, um das zu klären?
Meines Wissens hast Du diesbezüglich vollkommen Recht.
Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
sql bcnf


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
2 DropDown Felder in abhängigkeit hieger HTML, JavaScript, AJAX, jQuery, CSS, Bootstrap, LESS 1 12-05-2007 13:01
Open-Source-Projekt erwirkt Verfügung wegen GPL-Verletzung Abraxax News / Kostenloses 0 16-04-2004 09:25
Fenster in Abhängigkeit schließen Imion HTML, JavaScript, AJAX, jQuery, CSS, Bootstrap, LESS 16 14-11-2003 10:37
Loginbereich in Abhängigkeit von SQL-Anfrage Wurzelbohrer SQL / Datenbanken 0 31-03-2003 14:23
Funktionale Abhängigkeit und §. Normalform (bzw. BCNF) mrhappiness SQL / Datenbanken 2 09-02-2003 21:27

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 19:38 Uhr.