Datenbank Forum - für Anfänger und Profis

Willkommen im Datenbank Forum von Datenbanken-verstehen.de - Das Datenbank, Data Warehouse & Business Intelligence Forum!

Das Datenbank Forum für Anfänger und Profis ist eine Community zu den Themen Datenbanken, Data Warehouse & Business Intelligence. Nimm teil an der Community von Datenbanken-verstehen.de und tausch dich mit deinen Fragen und Lösungen mit anderen Nutzern aus.

Als registrierter Benutzer genießt Du viele Vorteile, wie

  • den vollen Zugang zu allen Foren und Unterforen
  • Kostenloses Lernmaterial inkl. Lösungen zum Thema Datenbanken
  • Zugriff auf DB-Tutorials, Best Practices und SQL-Snippets

Bevor Du einen Beitrag verfassen möchtest, kannst Du dich einfach kostenlos registrieren.

oder Einloggen mit



Beachte bitte die Forenregeln von Datenbanken-verstehen.de. Wir wünschen Dir viel Spaß im Datenbank Forum! - Dein Datenbanken-verstehen.de-Team

Konstanten als Foreign Keys nutzen

Ein gutes Datenbankdesign ist Pflicht! Doch wie geht man an die Datenmodellierung heran?
Hier treffen Datenbankdesign und Datenmodellierung aufeinander...

Konstanten als Foreign Keys nutzen

Beitragvon RSM_Tools » Mo 30. Mai 2016, 16:07

In meiner Datenbank gibt es unzählige Konstanten (zumindest nenne ich sie so).

Hier zwei Beispiele, was ich damit meine ...

  • Währungen: z.B. 1=EURO, 2=US-Dollar, 3=... ect.
  • Einheiten: z.B. 1=Meter, 2=Kilogramm, 3=... ect.

Bisher habe ich für all diese Arten von Konstanten je eine Tabelle angelegt, mit der jeweiligen Zahl als Primärschlüssel und einer Beschreibung/Bedeutung. In den jeweiligen Daten-Tabellen gab es dann Fremdschlüssel auf diese Konstanten.

Mittlerweile ist die sowieso schon sehr große Datenbank voll mit solchen Konstanten-Tabellen und sehr unübersichtlich.

Ich hätte stattdessen gerne eine einzige Tabelle "Konstanten", welche im Wesentlichen aus 3 Spalten besteht:
  • Die Art der Konstante (als Nummer) z.B. 1 = Währung, 2 = Einheit
  • Die Nummer der Konstante
  • Die Beschreibung der Konstante

... mit den ersten beiden Feldern zusammen als Primärschlüssel.

Das Anlegen der Konstanten-Tabelle wäre kein Problem. Probleme gibt es wenn ich in den Datentabellen, dort, wo die Konstanten benutzt werden sollen die Fremdschlüssel anlegen soll. Ich will eigentlich nur ein Feld mit der Konstanten-Nummer in der Daten-Tabelle und nicht auch noch den Konstanten-Typ in der Daten-Tabelle anlegen.

Hat jemand ein Konzept oder eine Idee wie man das Problem lösen kann? Sicher gibt es das Problem öfters.
RSM_Tools
 
Beiträge: 7
Registriert: Mo 30. Mai 2016, 15:41

Re: Konstanten als Foreign Keys nutzen

Beitragvon RainerH » Di 31. Mai 2016, 21:22

Hi,

das, was Du benutzt, ist eine typische Mapping-Tabelle. So verstehe ich das jetzt...
Bau Dir doch noch einfach einen zusammengesetzte Schlüssel aus allen Tabellenattributen.

Dann könntest du eine Spalte in der Zieltabelle mit "Nullable"-Eigenschaft aufbauen und deine Keys darauf verweisen.
Da Nullable nicht so schön ist, bau noch einen Dummy-Wert (Value: -1) ein.

Gruß
Nimm NICHTS persönlich -- alles ist Feedback...
RainerH
 
Beiträge: 221
Registriert: Fr 1. Nov 2013, 17:58

Re: Konstanten als Foreign Keys nutzen

Beitragvon RSM_Tools » Do 2. Jun 2016, 09:28

Vielen Dank RainerH für Deine Antwort.

Ich werde mal ein paar Dinge in diese Richtung versuchen und ggf. posten wie es gelaufen ist.

Mir ist wichtig, dass ...

  1. Typische Foreign Key Fehler (Konstante nicht vorhanden ect.) vom Server ausgelöst werden.
  2. In der Datentabelle nur ein Feld mit der Konstanten-Nummer vorkommt.

Danke
RSM_Tools
 
Beiträge: 7
Registriert: Mo 30. Mai 2016, 15:41

Re: Konstanten als Foreign Keys nutzen

Beitragvon SQLUnion » Do 2. Jun 2016, 11:01

Hallo RSM_Tools,

es wäre super, wenn Du deine Ergebnisse und Erkenntnisse posten würdest.
Dann könnten wir die Snippets in unseren Best Practices-Bereich aufnehmen, wenn Du magst.

Gruß,
SQLUnion
SQLUnion
 
Beiträge: 153
Registriert: Fr 1. Nov 2013, 15:54

Re: Konstanten als Foreign Keys nutzen

Beitragvon RSM_Tools » Do 2. Jun 2016, 11:02

Hallo,

nochmal danke für die Inspiration. Hier der von mir benutzte Lösungsansatz:

Anmerkung: Lov = List of Values

... zuerst erstelle ich eine Skalarfunktion etwa so

Code: Alles auswählen
CREATE FUNCTION [dbo].[IsInLov] (@pList int, @pId int) RETURNS BIT AS
BEGIN
   DECLARE @bResult AS BIT
   SET @bResult = 0
   IF EXISTS(SELECT *  FROM tbl_Sys_Lov_Values WHERE fld_List_Id = @pList AND fld_Const_Id = @pId)
   BEGIN
      SET @bResult = 1
   END
   RETURN @bResult
END


Die Funktion wird gebraucht, weil ich später eine Check-Constraint erstellen will und dort keine Sub-Queries erlaubt sind.

Im Tabellendesigner der Datentabelle kann ich jetzt die Check-Constraint etwa so anlegen:

Code: Alles auswählen
dbo.IsInLov(7, fld_FieldName) = 1


... wobei 7 die ID-Nummer des Constanten-Typs ist.

Einen einfacheren Ansatz konnte ich leider nicht finden, falls jemand jedoch eine Idee hat, immer gerne.

Vielen Dank
RSM_Tools
 
Beiträge: 7
Registriert: Mo 30. Mai 2016, 15:41


Zurück zu Datenbankdesign und Datenmodellierung

 


  • Related topics
    Antworten
    Zugriffe
    Letzter Beitrag

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron
  • Jetzt Fan werden
  • Newsletter abonnieren? Hier anmelden!

    Alle Informationen aus dem Portal, Blog und Forum in einem Newsletter!

    E-Mail-Adresse: