![]() |
sprechender Primärschlüssel 8)
Das hier ist Mabuses Schuld. :mrgreen: Aber es interessiert mich, ob so was immer noch Gang und Gäbe ist. Also : wie siehts aus, ohne ID ? Wer macht so was ? Ich kann ja noch verstehen, wenn einer bei Textilien eine "sprechende Art.-Nr." verwendet. Aber beim Primary Key hörts doch wohl auf. 8)
|
Re: sprechender Primärschlüssel 8)
Hallo,
niemals ohne ID, hatte ich hier auch schon mal gesagt. Unter gewissen Bedingungen, wie z.B. nur ein Messgerät könnte man noch einen Timestamp akzeptieren. Aber wie ich aus praktischer Erfahrung gelernt habe ist auch das schon fragwürdig. mfg wo |
Re: sprechender Primärschlüssel 8)
Ich kenne ein System, da war der PK ein zusammengesetzter Schlüssel, teilweise sogar mit VARCHAR-Spalten. War zwar sehr sprechend, IMHO aber auch eine Performance-Bremse.
|
Re: sprechender Primärschlüssel 8)
Zitat:
Ich kenne mehrere Systeme die sprechende Primärschlüssel haben. Das Beispiel mit den Datum habe ich ja schon gepostet. Das "Datenmodel" war schon "fertig" als wir in das Projekt einstiegen. Leider gab es keine Möglichkeit das wieder geradezubiegen. Das Projekt hatte über 300 Tabellen davon waren über 80 mit diesem sprechenden Schlüssel. Wenn ein Termin verschoben wurde, musste in allen 80 Tabellen der Schlüssel geändert werden. Da das ganze anfangs auf der BDE mit Paradox Dateien aufbaute und erst später nach Sybase SQL Server und danach auf MS-SQL Server portiert. auf dem SQL Server gab es wenigstens die Möglichkeit das Ganze in eine StoredProc zu packen. (Fast alle PKs waren sprechende Schlüssel, aber dieser war besonders schlimm!) Anderes Beispiel: In einer Anwendung zum Wertpapiergeschäft gab es einen sprechenden Schlüssel mit der WKN. Es hatte niemand damit gerechnet, das die WKN (Wertpapiernummer) durch die ISIN abgelöst wurde. So mussten die ganzen Schlüsselfelder erweitert werden um die längere ISIN aufzunehmen. Außerdem mussten neue Felder mit der "alten WKN" angelegt werden. Ich hätte lieber gleich eine fortlaufende Nummer als Primärindex genommen und die ISIN und WKN als Matchcode in 2 weitere Felder abgelegt. Die zu verwaltenden Fonds waren natürlich auch als sprechende Schlüssel angelegt :? (so konnte man direkt ohne Verknüpfung mit anderen Tabellen select Statements ausführten, die den Fonds oder die WKN selektierten. Das war die offizielle Begründung) Ich könnte noch einige Beispiele mehr nennen, (unter anderem auch in Fachkreisen bekannte Programme) die solche sprechenden Schlüssel haben :? Ach ja, die Programme sind immer noch im Produktiven Einsatz, auch wenn ich Sie (zum Glück) nicht mehr betreue. |
Re: sprechender Primärschlüssel 8)
Ich benutze grundsätzlich eine ID als PK. Auch bei Tabellen, wo man davon ausgehen sollte, dass es nicht erforderlich ist. Wie man Mabuses Beitrag sieht, ist das durchaus sinnvoll.
Aber wenn man Altlasten übernehmen muss, ist man halt in den A... gekniffen. P.S.: Warum steht das unter K&T? Gehört das nicht in Datenbanken? |
Re: sprechender Primärschlüssel 8)
Zitat:
Ich habe auch schon mit Systemen gearbeitet in denen alle Primärschlüssel so aussahen:
Code:
Also eine GUID.
c2755174-b4f7-4662-85b2-8579c851d48b
Da diese weltweit einmalig ist, kann man relativ leicht Syncronisationen von mehreren dezentral laufenden SQL Servern durchführen. Die PKs sind ja weltweit einmalig, also können Datensätze einfach "hinzukopiert" werden. Zu jedem Datensatz wird noch eine Timestamp gespeichert, dann kann man mit
SQL-Code:
einen Abgleich starten.
insert into TABELLE from
select * from TABELLE@REMOTEHOST where TIMESTAMP_FIELD > :TIMSTAMP_OF_LAST_SYNC Dumm nur, das eine GUID im VARCHAR2 oder CHAR nicht so performant ist wie ein Integer :? [edit] Das macht aber auch z.B. Sinn wenn die Clients auch offline Daten erfassen können, die dann erst mal lokal gespeichert werden und später mit dem Server syncronisiert werden. [/edit] |
Re: sprechender Primärschlüssel 8)
sicherlich ist es sinnvoll entititäten zu benutzen. je nach situation spricht imho nichts gegen einen mnemonischen schlüssel. oder?
|
Re: sprechender Primärschlüssel 8)
@Daniel :
Zitat:
Zum Thema : Zitat:
|
Re: sprechender Primärschlüssel 8)
@MaBuSE:
Es sind Integer-IDs. An GUID hatte ich bisher nicht gedacht. Da müsste man dann allerdings abwägen, ob man den Performance-Verlust zu Gunsten der Funktionalität (weltweiter Abgleich, Offline-Erfassung), akzeptieren kann. |
DP-Maintenance
Dieses Thema wurde von "r_kerber" von "Klatsch und Tratsch" nach "Datenbanken" verschoben.
Ich denke, das ist kein Klatsch mehr sondern eine Diskussion zu DB-Design. Deswegen verschiebe ich das mal zu Datenbanken. |
Re: sprechender Primärschlüssel 8)
Zitat:
|
Re: sprechender Primärschlüssel 8)
Ich denke, wenn man die einzelnen Blöcke nicht in Dezimalzahlen umrechnen will, muss man es als String speichern.
|
Re: sprechender Primärschlüssel 8)
Das ist ja alles schön und gut. Was ich nur nicht verstehe, das ist, wie man so eine "sprechende Nummer" zum PK machen kann. Bzw. sogar zum einzigen Key. Was hindert einen denn dran, zuerst einmal eine ID als PK zu vergeben und dann noch ein Feld mit der komischen Nr. Das ist doch genau das, mit was Mabuse schon kämpfen mußte. Wenn ich einen Artikel habe und 100 Kunden haben dafür Preise hinterlegt. Dann ist es doch IMHO Leichtsinn, die Artikel-Nr. in der DB zu speichern, also als PK. Die ID dient doch gerade zum Entkoppeln von abhängigen Tabellen.
P.S.: Ah ja, verschoben. Und ich weiß, wie es hier hin gelangt ist. War in dem Klatsch und Tratsch-Thread und hatte "neues Thema" angeklickt. 8) |
Re: sprechender Primärschlüssel 8)
Zitat:
|
Re: sprechender Primärschlüssel 8)
Zitat:
Aber wenn der DB-Designer das nicht weiß, dann nimmt er Strings. :mrgreen: Ich habe schon Schlimmeres erlebt. :roll: |
Re: sprechender Primärschlüssel 8)
Zitat:
MS-SQL z.B. kennt zwar den Feldtyp uniqueidentifier. Dieser wird aber intern als ein String aus 32 Zeichen behandelt wenn ich es richtig gelesen hab. BTW: Delphi kennt den VariablenTyp : TGUID Aber das ist ja eigentlich nicht das Thema des Threads. Grundsätzlich denke ich das man mit einem Integer als PK am besten fährt. Aber wenn es zum Beispiel wie von MaBuSE angesprochen um die Sync. von verschiedenen Servern/Datenbanksystemen geht hat die GUID oder andre "sprechende" Schlüsseln natürlich seine Vorteile und auch seine Daseinsberechtigung. Entscheidend ist die Frage: Wie wirkt sich deren Verwendung auf Geschwindigkeit der Anwendung aus? Wenn ich z.B eine weltweite Erfassung von Daten mache. Diese Daten teilweise auf verschiedenen Servern und teilweise in lokalen DBs gespeichert werden und meine Abfrage später keine großen Verknüpfungen benötigen bin ich mit der Verwendung einer GUID sicher besser beraten als die Verwendung von Integer-IDs. |
Re: sprechender Primärschlüssel 8)
Meiner Ansicht nach hat eine GUID in dem Zusammenhang absolut nichts zu suchen. Ganz davon abgesehen, daß sie viel zu lang ist. Deshalb wohl auch die -. Mabuse, ging es bei Dir nur um die eindeutige Identifikation eines Standortes, oder was ? Wenn ich MAC-Adressen, GUIDs usw. in der DB verbaue, dann ist man nämlich schnell wieder am Anfang !
|
Re: sprechender Primärschlüssel 8)
Hallo Leute,
ich glaube, mir ist etwas entgangen!! Was ist ein "sprechender Primärschlüssel" ?? Meine Primärschlüssel heißen alle ID und sind vom Typ AutoInc und damit es keine Probleme mit zermatschten Datenbanken gibt (insbesondere mit Paradox-DB) habe ich immer noch einen <Name>ID vom Typ Integer eingeführt, die die Verbindung mit anderen Datenbanken herstellt und <Name> eine Zeichenkette ist, die etwas mit der verwendeten Datenbank zu tun hat (Art = Artikel, Auf = Auftrag usw.) Die zweite ID bleibt auch dann erhalten, wenn es mal wieder eine Paradox-DB zerlegt hat und sich die Daten nur durch kopieren der einzelnen (unbeschädigten) Datensätzen reparieren ließ, wodurch aber alle ID's vom Typ AutoInc neu erzeugt werden und nicht zwangsläufig mit den originalen übereinstimmten. mfg eddy |
Re: sprechender Primärschlüssel 8)
Zitat:
|
Re: sprechender Primärschlüssel 8)
Es gibt ja auch nichts gegen sprechende Schlüssel einzuwänden (an die Schreibweise muss ich mich wirklich noch gewöhnen :roll: ). Der PK sollte das aber nicht sein.
Ich benutze auch sprechende Schlüssel, die aus mehreren Feldern zusammengesetzt sind. Da wird aber kein einzelnes Feld draus gemacht, sondern einfach ein zusammengesetzter Index gebastelt, der i.d.R. auch noch Unique ist. Aber der PK ist bei mir immer Integer und hat mit dem sprechenden Schlüssel nichst zu tun. Die Relationen zwischen den Tabellen werden auschließlich über den PK definiert, niemals über den sprechenden Schlüssel. Wer es anders macht, sollte erschossen werden. :mrgreen: |
Re: sprechender Primärschlüssel 8)
Ich bin für erhängen. :mrgreen: Besonders schlimm finde ich, da noch den string mit Sonderzeichen zu maskieren. 8) Wie soll denn das gehen, da z.B. ein ON DELETE CASCADE zu machen ? Der "Fall Mabuse" :lol: zeigt ja schön, wie man sich oder anderen das Leben schwer machen kann.
|
Re: sprechender Primärschlüssel 8)
Zitat:
Zusammengefasst: Im "Fall MaBuSE" bin ich unschuldig !!! |
Re: sprechender Primärschlüssel 8)
Zitat:
Wie willst Du sonst eine Syncronisation z.B. mit 1.300 SQL Server (weltweit verstreut) und ca. 50.000 Clients (die alle offline Daten erfassen können) realisieren. Die Clients syncronisieren sich mit dem Server, die Server syncronisiersn sich gegenseitig über ein paar Duzend SQL-Server die im Cluster laufen. (Master SQL-Server in der Zentrale). Zu GUID und 128 Bit Zahl oder String. Nicht alle SQL-Server bieten einen GUID Datentyp an. Vor allem nicht die lokalen auf den Clients (z.B. Paradox oder DBase) Wenn man heterogene Netzwerke hat ist das alles nicht so einfach. |
Re: sprechender Primärschlüssel 8)
Selbst wenns so viel wird, wieso dann mit GUID ? Ich habe auch einen mit vielen Filialen. Jede hat eine eindeutige Nr. Wirds länderübergreifend, dann würde ich eventuell noch eine Länderkennziffer einführen. D wäre dann eben 49 und jede Filiale hätte eigene eindeutige Nr. wie gehabt.
|
Re: sprechender Primärschlüssel 8)
Zitat:
Es hat niemand etwas gegen sprechende Schlüssel. Aber eben nicht als Primärschlüssel !!! Viele verwenden ja auch Matchcodes um einen sprechenden "Schlüssel" zu haben. Das sind aber dann nur Sekundärschlüssel !!! [equote="Artikel über Data-Mining im WikiPedia ( ![]() [/equote] Die Anwender in meinen Programmen bekommen nie den PK zu sehen, wohl aber den Matchcode. Dadurch kann der Anwender die Zeile eindeutig identifizieren. In der Datenbank wird der Matchcode als Feld angelegt und automatisch gefüllt. Alle Verknüpfungen sind aber über den PK realisiert !!! [edit] Wenn ich hier schon den Link zum Data-Mining (s.o.) poste gibts hier auch noch einen interesannten Link zum Data Warehouseing: ![]() [/edit] |
Re: sprechender Primärschlüssel 8)
Zitat:
Was ist wenn Du nciht weisst, wer Dein Programm verwendet. z.B. öffentlicher Download des Clients im Internet. Außerdem ist es sehr einfach eine GUID zu erzeugen. Fast jede Sprache hat mitlerweile eine Funktion zur Erzeugung einer GUID. (Nicht nur auf Windows). Oder was ist wenn Du aus Datenschutz die Einträge anonym einsammeln willst. Also keine Länder / Filial ID haben möchtest? Aber jetzt wirds offtopic. Eine GUID ist ja schliesslich kein sprechender Schlüssel :mrgreen: [equote="MaBuSE schrieb in ![]() |
Re: sprechender Primärschlüssel 8)
Ist die Zuordnung der Daten egal, oder sogar anonym, dann wäre das mit GUID vielleicht gut so. Aber ich kann mir nicht vorstellen, daß so was in einer Firma mit vielen Filialen geht. Ich hätte jedenfalls keine Lust, mir bei hardwarebedingten Windows-Neuinstallationen usw. die halbe Datenbank wegen anderer GUID umzuspeichern. Genau solche Fälle sind doch der Grund für IDs usw. Nämlich das entkoppeln der Daten vom Zugriffsmechanismus.
Bspw. Art.-Nr. oder Kunden-Nr. war bei mir schon immer ein normales Feld. Intern werden die Verknüpfungen allerdings über IDs realisiert. Man stelle sich mal vor, aus irgendwelchen Gründen muß die Ku.-Nr. geändert werden ! Wie Mabuse schon sagt : an die PKs kommt sowieso keiner dran. Und sprechende (nicht) Primary Keys finde ich auch überflüssig. IMHO sollte man zusammengesetzte benutzen, aber keine im Klartext ! Zumindest bei mir siehts so aus, daß ich z.B. für einen Preis, den Key zusammensetze als ID_KUNDE + ID_ART und dann natürlich als unique. Ich könnte ihn auch eindeutig machen durch Kunde.Nr + Art.Nr, aber dann wäre ich wieder in dem Dilemma, falls sich eine Nr. ändert. Zum Schluß noch der Matchcode. Wozu den extra speichern ? :shock: Das sind dann Redundanzen und die sollte man vermeiden. Hinzu kommt dann noch ein Problem. Entweder er wird so abgekürzt, daß ein Dritter gar nicht drauf kommt, oder er ist so lang, daß auch der kleinste Schreibfehler dazu führt, daß nichts gefunden wird. Und ich habe trotz UPPER,%LIKE% usw. noch keine Performance-Einbußen bemerkt. |
Re: sprechender Primärschlüssel 8)
Zitat:
Felder <> Key ! Es wir ja "nur" ein Key auf das Feld gesetzt. Ds Zusammensetzen eines Keys bedeutet damit noch nicht, dass es ein neues Feld gibt, wo die Feld-Inhalte zusammengesetzt werden. Als zusammengesetzter Key kann das dann wieder Unique sein, aber die Felder bleiben getrennt. Matchcode: Benutzen wir auch bei Adressdaten. In der Firmenbezeichnung stehen of genug Daten, die du mit einem Upper und Like nicht finden kannst. Denke nur mal an Firmenabkürzungen mit und ohne Punkt/Leerzeichen. Wir legen zumindest Wert darauf, dass die Kunden so angeschrieben werden, wie in ihrer offiziellen Firmenbezeichung. Das ist aber auch die einzige Stelle, an der wir einen Matchcode verwenden. |
Links zu Informationen über Primärschlüsseln und Datenbanken
Ich habe hier mal was zum Lesen zusammengestellt:
Primärschlüssel:
|
Re: sprechender Primärschlüssel 8)
Zitat:
|
Re: sprechender Primärschlüssel 8)
Matchcode:
Nehmen wir mal die fiktive Firma "a.t.u.". Genügt das als Gegenbeispiel? Da hilft kein Upper und kein Like. Im Matchcode stünde "atu". Da geht das dann. Zusammesetzung aus mehreren Feldern: Beispiel: Ein Artikel setzt sich aus einer Kurzbezeichnung und aus mehreren Abmessungen zusammen. Da nehme ich einfach einen kombinierten Unique-Key über die entsprechenden Felder. Das hat dch mit den IDs nichts zu tun. Oder reden wir aneinander vorbei? |
Re: sprechender Primärschlüssel 8)
Zitat:
Die GUID ist doch nur eine weltweit eindeutige Zahl. Ihre Benutzung ist nicht an ein Windows System gekoppelt. (Auch wenn einige Infos z.B. MAC Adr. einfliessen) Verstehe die Zahl ainfach als das was sie ist. Eine von allem entkoppelte einmalige Zahl. Warum willst Du diese "Zufallszsahl" ändern, wenn Du einen Rechner neu installierst? Zitat:
Merke: Primärschlüssel werden NIE geändert !!! Deshalb sollten sie keine Informationen enthalten. Verstehe die GUID als eine eindeutige Zufallszahl ohne weitere Informationen !!! Zitat:
Zitat:
Was ist ein nicht primärer Schlüssel (oder sekundärter Schlüssel) Auf einem SQL-Server nennt man so etwas Index. Und ein Index wird dazu verwendet einen schnellen Zugriff auf das Feld (oder die Felderkombination) zu bekommen. Bsp. In einer Tabelle Kunde gibt es einen PK, eine KundenNr. und den Namen. Ich lege einen sekundärschlüssel auf Name und Kundennummer, damit ich schneller sortierenkann (order by Name) bzw auch schneller finde (where KundenNr=1234). Allein schon aus Performancegründen finde ich also "sprechende (nicht) Primary Keys" nicht überflüssig. (Erklärungen auch hier: ![]() Zitat:
Ich hoffe ich habe jetzt alle Klarheiten beseitigt ;-) |
Re: sprechender Primärschlüssel 8)
Zitat:
Ich habe in etlichen Programmen schon solche Kundennummern gesehen. Es entstehen dann so "lustige" Kundennummern wie: ATU-FFM-02 |
Re: sprechender Primärschlüssel 8)
Zitat:
Zur GUID : selbe Geschichte. Was, wenn Windows neu installiert wird ? Die GUID ist wieder eindeutig, insofern anders als vorher. Was nun ? |
Re: sprechender Primärschlüssel 8)
Zitat:
ich glaube Du hast hier etwas falsch verstanden ;-) Wir reden nicht von der GUID welche Windows für sich selber erzeugt hat! Du kannst Dir ganz einfach GUIDs erzeugen. Mit diesem Code z.B. bekommst Du immer GUIDs die jeweils eindeutig sind:
Delphi-Quellcode:
Diese GUIDs haben nichts mit meinem OS zu tun. Es sind einfach nur 128Bit Zufallszahlen.
uses
ActiveX, ComObj; function GuidToDezString (aGuid : TGuid) : String; var ndx : integer; foo : string; begin foo := IntToStr (aGuid.D1); foo := foo + '-' + IntToStr (aGuid.D2); foo := foo + '-' + IntToStr (aGuid.D3); foo := foo + '-'; for ndx := 0 to 7 do begin foo := foo + IntToStr(aGuid.D4[ndx]); end; result := foo; end; function Neue_GuID: TGuid; var guidWork: TGUID; begin CoCreateGuid(guidWork); Result := guidWork; end; procedure TForm1.Button1Click(Sender: TObject); var ndx : integer; guid : TGuid; sGuid : string; begin for ndx := 1 to 10 do begin guid := Neue_GuID; Memo1.Lines.Add('Hex : ' + GuidToString (guid)); Memo1.Lines.Add('Dez : ' + GuidToDezString(guid)); Memo1.Lines.Add('----------------------------------'); end; end; |
Re: sprechender Primärschlüssel 8)
Zitat:
Zitat:
(*) ![]() Hier ist der .net Code zum erzeugen einer GUID (Analog sharkys Beispiel)
Delphi-Quellcode:
// Code in C#:
String MyGuid = System.Guid.NewGuid().ToString(); MessageBox.Show (MyGuid); // Code in Delphi.NET var MyGuid: String; begin MyGuid := System.Guid.NewGuid.ToString; MessageBox.Show(MyGuid); end; Zitat:
|
Re: sprechender Primärschlüssel 8)
Ah ja, wir reden bloß über eine Zufallszahl ? Ist zwar so gut wie unmöglich, aber auch Zufälle kommen mehrmals vor. Aber egal, wer benutzt so was als Primärschlüssel ?
|
Re: sprechender Primärschlüssel 8)
Die Wahrscheinlichkeit, zweimal von einem Blitz getroffen zu werden, ist auch nahezu ausgeschlossen. Aber es kommt vor.
Die Wahrscheinlichkeit, einen 128er-Code per Zufall zu entschlüsseln ist auch möglich. Da übernimmt auch niemand irgendwelche Garantien. Ich sehe das auch so wie Hansa. Wenn ich es nicht sicherstellen kann, verlasse ich micht nicht darauf. |
Re: sprechender Primärschlüssel 8)
Zitat:
Es müssen dann also schon 2 Rechner die selbe MAC Adresse haben, die GUID zur selben Zeit erzeugen und dann noch genau die selbe zufallszahl erzeugen, erst dann ist die GUID zweideutig. (Wer weiß was da noch alles in die GUID einfliesst) |
Re: sprechender Primärschlüssel 8)
Zitat:
Wenn tatsächlich ein PK 2 mal vorkommen sollte, so muß dann aber nur einmal pro (sehr seltene Ausnahme) in die PKs eingegriffen (oder abgelehnt) werden. Dieses Verfahren wird in der Praxis bereits tausendfach eingesetzt und funktioniert herrvoragend. Du sagt ja auch nicht: "Ich benutze keine Ehternet, weil es dort zu Kollisionen kommt und ich meine Daten teilweise mehrfach senden muß." |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:43 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz