Einzelne Werte von Variablen (Zeichenketten, int, ...) in Datenbank speichern
-
Derzeit soll bei uns ein System zur Prüf- und Betriebsmittelerfassung standortübergreifend erstellt werden. Als Datenbank kommt MS SQL Server 2008 zum Einsatz.
Aus Performance-Gründen wird z.B. beim ERP-System die letzte Seriennummer (zusammengesetzte Zeichenkette aus YYYYMMTT+SN+fortlaufende, vierstellige Nummer mit führenden Nullen) separat in der Datenbank abgelegt (hab leider nur noch nicht gefunden wo). Beim Neuanlegen von Aufträgen wird diese Last-Number gezogen und dieser fortlaufende Nummernanteil inkrementiert. Sicher könnte man auch die DB öffnen und die Seriennummern sortieren und sich dann die letzte herausholen, aber es wird halt so wie beschrieben gemacht. Wie speichert man solche Einzelwerte (Integer-Zahlen, Zeichenketten, ...) sinnvoll ab? Mach man dazu eine eigene Tabelle mit nur einem Eintrag oder geht das eleganter? Es muss in die DB, da viele Clients zeitgleich zugreifen, die sich lokal nicht austauschen können (also nur über die DB).Bin dankbar für jeden Hinweis/Ratschlag. Da wir noch am Anfang vom Design stehen ist noch alles offen
-
separat in der Datenbank abgelegt
die Seriennummer ist also schon drinn
Beim Neuanlegen von Aufträgen wird diese Last-Number gezogen und dieser fortlaufende Nummernanteil inkrementiert.
ist also schon implementiert
Sicher könnte man auch die DB öffnen und die Seriennummern sortieren und sich dann die letzte herausholen
ich dachte das wäre schon implementiert - oder doch nicht?
Wie speichert man solche Einzelwerte (Integer-Zahlen, Zeichenketten, ...) sinnvoll ab?
Was meinst du genau - welche Datentypen? damit man schnell zugreifen kann?
Da wir noch am Anfang vom Design stehen ist noch alles offen
also ist doch nich nichts implementiert???
Stell die Frage noch mal ordentlich mit Ist/Soll-Zustand, deine Ideen dazu und was du denkst was daran schlecht ist
-
Ich hatte ja geschrieben das noch nichts implementiert ist. Aber noch mal das Beispiel mit den Seriennummern. Derzeit gibt es z.B. eine Seriennumer 2017SN00235. Wenn man die inkrementiert soll 2017SN00236 rauskommen. Da aber noch andere Seriennummertypen in der gleichen Tabelle vorkommen (z.B. XB00147) kann ich nicht wild sortieren, da ich jeweils für die SN- und XB-Variante die Last-Number brauche. Das ERP-System, was wir verwenden, speichert das aus diesem Grund.
Nächstes Problem: jetzt sollen noch Prüf- und Betriebsmittelnummern kommen, die wie folgt aussehen: RD-QW-A012-U001. Inkrementieren heißt hier einmal, dass aus A012 A013 werden kann bzw. aus U001 U002 wird je nach dem, was gefordert ist. Sortieren ist hier noch schwieriger.
Die Frage stellt sich hier nicht nach dem Sinn oder Unsinn, sondern ob es möglich ist einen einzelnen Wert (Zeichenkette oder int-Wert) direkt abzuspeichern oder muss man da eine Tabelle mit einem Eintrag machen.
-
AndyDD schrieb:
YYYYMMTT+SN+fortlaufende, vierstellige Nummer mit führenden Nullen
Wenn noch nichts implementiert ist würde ich die einzelnen Teile der Seriennummer in einzelne Spalten aufteilen. (Daraus kann man dann ja auch eine zusammengesetzte machen).
Das selbe gilt für die Prüfmittel u.ä. Als Beispiel für den Seriennummer Teil:
Datum Teil der SN | Buchstabenteil | Inkrementierbarer Teil | zusammengesetzt (fals du das extra brauchst) |
Wenn es unterschiedliche Arten von Seriennummern gibt, würde ich die auf verschiedene Tabellen aufteilen.
-
Schlangenmensch schrieb:
Wenn noch nichts implementiert ist würde ich die einzelnen Teile der Seriennummer in einzelne Spalten aufteilen. (Daraus kann man dann ja auch eine zusammengesetzte machen).
Das ist mir schon soweit klar, jedoch ist das nicht die Frage. Ich will einfach nur wissen ob es geht einen einzelnen Wert (Variable vom Datentyp varchar oder int) losgelöst von einer Tabelle in einer Datenbank abzuspeichern. Das mit den Seriennummern diente nur zur Erklärung.
-
Eine Datenbank verwaltet nur Tabellen, also mußt du auch für einen Einzelwert eine eigene erstellen (und wenn sie nur aus einer Spalte mit einer Zeile besteht, wie z.B. die DUAL table).
-
Th69 schrieb:
Eine Datenbank verwaltet nur Tabellen, also mußt du auch für einen Einzelwert eine eigene erstellen (und wenn sie nur aus einer Spalte mit einer Zeile besteht, wie z.B. die DUAL table).
Also geht es nicht. Danke für die Antwort, genau das wollte ich ja wissen...
-
Postgres unterstützt Composite Types, vielleicht kann MSSQL etwas ähnliches.
-
Hi AndyDD,
AndyDD schrieb:
Th69 schrieb:
Eine Datenbank verwaltet nur Tabellen, also mußt du auch für einen Einzelwert eine eigene erstellen (und wenn sie nur aus einer Spalte mit einer Zeile besteht, wie z.B. die DUAL table).
Also geht es nicht. Danke für die Antwort, genau das wollte ich ja wissen...
Ich weiß nicht, warum Du das in der Datenbank speichern willst?
Das ist redundanter Schnuggebutz, der zu Inkonsistenzen führen kann. Alle Angaben dafür liegen doch schon vor. Besser ist es doch, Du baust Dir eine View, die Dir genau die benötigte Zeichenkette zusammensetzt
Bei Access könnte das z.B. so in Etwa aussehen:select YYYYMMTT_Datum & SN & cstr( FortlaufendeVierstellige + 1 ) as Kennung from Tabelle where FortlaufendeVierstellige = ( select Max( FortlaufendeVierstellige ) as MaxVierstellige from Tabelle )
Und dann eventuell am Besten in einem Trigger oder was Dir Deine DB bieter beim Abspeichern eines neuen Datensatzes setzen.
Gruß Mümmel
-
muemmel schrieb:
Hi AndyDD,
Ich weiß nicht, warum Du das in der Datenbank speichern willst?
Das ist redundanter Schnuggebutz, der zu Inkonsistenzen führen kann. ...Mir ist klar das diese Angaben redundant vorliegen. Das hat Performance-Gründe. Die Tabelle hat ca. 400.000 Einträge, Tendenz steigend. Wenn man hier ständig durch alle Datensätze durchsteppen muss um den Max-Wert zu ermitteln dauert das nun mal. Es ist übrigens auch nicht immer sinnvoll alles bis zur 5. Normalform zu normalisieren. Dies geht oft zu Lasten der Performance. Auch die SAP-Datenbanken sind nicht immer bis zum Erbrechen normalisiert.
Außerdem hab ich kein Access (siehe erste Post) sondern einen ziemlich ausgelasteten MS SQL-Server.DocShoe schrieb:
Postgres unterstützt Composite Types, vielleicht kann MSSQL etwas ähnliches.
Das gibt's bei MS leider nicht. Ich werd das mit der einen Tabelle mit einem Eintrag realisieren. Scheint mir noch die simpelste Lösung. Ja, es stellt eine Redundanz dar, das nehm ich aber in Kauf wenn ich die Kiste etwas entlasten kann.