Frage

Ich mag einen zusammengesetzten Schlüssel machen (gut, dass die Idee, aber ich bin offen für andere Vorschläge) auf einer Dokumenten-Tabelle. Es wäre aus zwei Säulen, Jahr (2010, ...) und eine ID, die selbstinkrementierende werden würde, aber es sollte sich jedes Jahr neu zu starten.

So Tasten wie diese 2010-1, 2010-2, ..., 2011-1, 2011-2, ... und, vorzugsweise sollten diese Schlüssel auch für die Anzeige verwendet werden, den Druck und die Suche.

Obwohl ich nicht glaube, selbstinkrementierende funktionieren wird, weil der Reset jedes Jahr, so dass ich denke, ich werde Schritten selbst machen müssen, nicht wahr?

Oder sollte ich nur eine Varchar-Spalte machen und jeden Schlüssel selbst konstruieren und stellen nur eine einzigartige auf dieser Spalte?

Also, was sind meine Optionen?

Bitte beachten Sie auch unter Berücksichtigung zukünftiger Design-Fragen, dass ich mit einem gewählten Design haben könnte, was würde es von Abfrage- und erleichtert.

UPDATE:

Ich fange wirklich zu schauen, die Anwendung Konstrukts lassen Sie die Taste und es schaffen, wenn das Einfügen. Allerdings wäre es für die letzten ausgegebenen ID suchen in DB erfordern, was zu Problemen in hochvolumige Nutzung führen kann.

War es hilfreich?

Lösung

Es ist eine gute Praxis zu trennen Geschäft mit Datenspeicherstruktur. Warum? Denn morgen jemand zu ändern Business-Logik entscheiden wird:

  • Verwendung nicht-ganzzahligen Dokumentreihenfolge (1-AA, 1-AB, 1-AC ...)
  • umfassen Jahr und Monat einige monatliche Berichte erstellen
  • andere Änderungen ...

Und was Sie tun sollten, als?

Also, meine Lösung ist:

  • verwenden Primärschlüssel (int zum Beispiel oder Ihren bevorzugten Datentyp) Beziehung in der Datenbank mit anderen Tabellen zu tun
  • Verwendung Business Key 1.2.3 ... wie Sie wollen (vielleicht einige Kennung Generator)
  • verwendet Datetime-Feld zum Speichern von Datum Dokument hinzuzufügen, das Jahr, das Sie können dynamisch berechnen.

Andere Tipps

Warum ein tatsächliche automatische Erhöhung id nicht hinzufügen? Composite-Tasten können schnell wachsen, wo sie sind praktisch nutzlos - vor allem aus Gründen der Performance, wenn Sie jemals auf dem Tisch zu kommen haben. Wenn Sie dann wollen auch log, dass Dokument XYZ das erste Dokument in 2010 gespeichert war, konnte man immer noch Ihre Year und Order (oder was auch immer) Spalten, aber Ihre Primärschlüssel bleibt schön und sauber.

Wenn Sie sich die Mühe der Schaffung eines mit automatischer Erhöhung Schlüssel gehen, würde ich die Idee, werfen es auf jedes Jahr Zurücksetzen und nur eine Identity-INT Spalte anstelle.

Wenn Sie die Sequenznummer des Dokuments innerhalb des Jahres erhalten möchten, gibt es SQL-Funktionen Sie verwenden können, das zu tun:

ROW_NUMBER () OVER (PARTITION BY ... ORDER BY ...)

  

Obwohl ich nicht glaube, automatische Erhöhung funktionieren wird, da der Reset jedes Jahr, so dass ich denke, ich werde Schritte selbst machen muß, nicht wahr?

Ja.

empfehle ich das Hinzufügen einer Spalte, um die Rückfallwert zu erzeugen. Eine Identity-Spalte wäre am besten; ein DATETIME- konnte die Rekord Erstellungszeit aber Transaktionen innerhalb 3,33 Millisekunden (0 00.333 Sekunden) voneinander hätte den gleichen Zeitstempel halten.

So oder so, man kann den id Wert erzeugt mit:

SELECT (SELECT COUNT(*)
          FROM DOCUMENTS t
         WHERE t.year = d.year
           AND t.col <= d.col) AS id,
        d.year
   FROM DOCUMENTS d

Oder wenn Sie auf SQL Server 2005+ sind, könnten Sie verwenden:

 SELECT ROW_NUMBER() OVER (PARTITION BY d.year ORDER BY d.col) AS id,
        d.year
   FROM DOCUMENTS d
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top