Announcement

Collapse
No announcement yet.

Tabellendesign: Felder die in jeder Tabelle vorkommen bzw. Logtabelle

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Tabellendesign: Felder die in jeder Tabelle vorkommen bzw. Logtabelle

    hallo,
    ich hab mal eine Frage zu Tabellendesign. Ich nutze Tabellenstrukturen wie nachfolgendes Beispiel zeigt. Wenn ich kein Spezielles Verhalten benötige besteht eine Tabelle immer nur aus diesen Spalten, einziger Unterschied ist immer der Prefix und natürlich der Tabellenname.

    CREATE TABLE [dbo].[tbl_fragetyp](
    [fragetypID] [bigint] IDENTITY(1,1) NOT NULL,
    [fragetyp_bezeichnung] [nvarchar](200) NULL,
    [fragetyp_beschreibung] [nvarchar](max) NULL,
    [fragetyp_reihenfolge] [int] NULL,
    [fragetyp_angelegtvon] [nvarchar](200) NULL,
    [fragetyp_angelegtvonID] [int] NULL,
    [fragetyp_angelegtam] [datetime] NULL,
    [fragetyp_geaendertzaehler] [int] NULL,
    [fragetyp_geaendertvon] [nvarchar](200) NULL,
    [fragetyp_geaendertvonID] [int] NULL,
    [fragetyp_geaendertam] [datetime] NULL,
    [fragetyp_geloescht] [bit] NULL,
    [fragetyp_geloeschtvon] [nvarchar](200) NULL,
    [fragetyp_geloeschtvonID] [int] NULL,
    [fragetyp_geloeschtam] [datetime] NULL

    "Zum Glück" habe ich irgendwann mal bemerkt dass ich immer das gleiche mache und erstelle mir mittlerweile diese Tabellen automatisch inkl. einer allgemeingültigen MS_Description.

    Gerade weil ich im unteren Teil immer dieses "wer hats gemacht" speichere kam ich auf die Idee dass es evtl. noch andere Ansätze gibt. Z.B. die Änderungen in einer einzigen Tabelle mit dem Sinn "ÄnderungsLog" zu speichern. Felder betroffener Datensatz, betroffene Tabelle, Datum, Fall (Insert, Update, Delete), evtl. betroffenes Feld, Benutzer. Ginge ja z.B. mit einem Trigger.

    Wie löst ihr das, wenn ihr zu nahezu jeder Tabelle und Datensatz die Person nennen können sollt welche die Änderung gemacht hat? Gibts Erfahrungen zur Verwendung einer Logtabellen im Vergleich zu meinem Ansatz? Gibt es evtl. weitere Ansätze?

  • #2
    hey openshinok,

    also mein tabellen design schaut so ähnlich aus. nur habe ich created, created by, updated und updated by als spalten. bin mir nicht sicher ob die geloescht spalten so sinnvoll sind. denn, die gelöschten zeilen wirst du wohl kaum in der gleichen tabelle wieder finden

    für gewöhnlich dienen ja die spalten ("created, updated") dafür, dass ich weiß, wer was für änderungen in den tabellen durchgeführt hat. aber bei manchen tabellen habe ausführliche logs laufen. dazu verwende ich trigger, der mir dann auch sagen kann, wer wann was von was auf was geändert hat... usw

    grüße

    Comment


    • #3
      hallo,
      ich verwende keine echten DELETEs. Gelöscht wird nur per Flag und stets per SP. So bleiben auch meine Fremdschlüsselbeziehungen vorhanden und ich "verliere" keine Informationen.

      Welchen Benutzer speicherst du? Den der auf die Datenbank zugreift, also Windows oder SQL-Benutzer oder den Benutzer mit dem sich der Benutzer an der Anwendung anmeldet (Benutzertabelle, unabhängig von Windows- oder MSSQL-Benutzer)

      Ich verwende meist Webanwendungen wo ich die Benutzer per separater Benutzertabelle anmelden lasse und der Datenbankzugriff mit einem einzigen SQL-Benutzer erfolgt. Dadurch dass ich mit SPs arbeite habe ich den Anwendungsbenutzer stets. Allerdings hab ich ihn nicht so einfach wenn ich einen Trigger verwende.... da fällt mir nur ein dass ich ermittle welcher Benutzer gerade ins *_geaendertvon-Feld geschrieben wird....

      Primärschlüssel als bigint oder uniqueidentifier?

      edit:
      was verwendest du als Bezeichnung oder Beschreibung? Ich kam drauf weil in .Net auch jedes Objekt einen "Name" und "Description" hat... Wir hast du das gelöst?

      Comment


      • #4
        also ich habe eine asp anwendung, die auf meine datenbank zugreift. auf datenbank-ebene habe ich für diese anwendung ein account angelegt, damit die nicht alles sieht, was ich alles auf der datenbank habe. über die asp anwendung habe ich meinen .net kollegen gebeten, bei jeder transaktion den user, der sich in der applikation angemeldet hat, mit in die tabellen zu schreiben.(created, updated)

        user auf datenbank-ebene haben bis auf mir und meiner vertretung keine schreibrechte auf die live-datenbank(Tabellen in dem live-Schema). somit weiß ich ganz genau wer was in meiner datenbank ändert.

        also ich habe einerseits eine login tabelle. und wenn der sich erfolgreich eingeloggt hat, dann wird er von einer benutzerkontrolle verwaltet.

        genau so wie du, hole ich mir die information vom created oder updated feld. da steht dann immer drin, welcher applikations-benutzer geinsertet oder upgedatet hat.

        sp verwende ich nur noch selten, nur noch für überdimensionale joins . wir gebrauchen hauptsächlich das entity framework.

        ich habe auch kleine tabellen, wo ich für ein primärschlüssel nur ein int verwende. für größere tabellen nehme ich bigint her.

        bezeichnungen oder beschreibungen sind glaub ich geschmackssache. ich verwende stattdessen kommentar.

        Comment

        Working...
        X