2009-06-03 1 views
5

Ich habe über den besten Weg nachgedacht, einen 'Live'-Satz von Daten und einen Entwurfsdatensatz in der Datenbank zu halten. Die Live-Version wird auf einer Website angezeigt und die Entwurfsversion wird bearbeitet, bis sie live geschaltet werden kann. Das Modell ist relational und besteht aus vielen Tabellen.Datenbankmodell für Live- und Entwurfsdaten

Meine aktuelle Methode ist 2 Datenbanken zu haben, eine für Entwurf und eine für Live. Wenn Sie die Daten in den Live-Modus übertragen, übernimmt SQL nur die Daten vom Entwurf der Datenbank zur Live-Datenbank.

Das ist in Ordnung, aber ein wenig langsam und scheint chaotisch. Und häufig muss SQL beide Sätze von Tabellen berücksichtigen.

Eine andere Möglichkeit wäre, einen Live-Indikator als Teil des Schlüssels jeder Tabelle zu erstellen, sodass ich sowohl live als auch draft in der gleichen Tabelle speichern kann - und den Indikator aktualisieren, um die Daten live zu machen. - Ich bin nicht wirklich auf diese Idee verkauft.

  • Das DBMS ist Sybase.

Ich wäre dankbar, wenn jemand andere Vorschläge hat.

U.M.

+0

Danke für die Antworten bisher. Sie haben mir einige Ideen gegeben. - Live und Entwurf in der gleichen Tabelle - ich muss sicherstellen, dass Datenentwurf nicht versehentlich angezeigt wird. - Mit einer Flagge und setzen Sie es auf den Entwurf Zeilen, um sie zu leben .... Ich könnte auch die alte Live-Zeile 'veraltet' markieren und die Anwendung wird dann einen Schnitt von 'Live' und speichern, wenn Entwurf Es gibt Änderungen. Auf diese Weise vermeide ich ein großes Löschen, wenn Daten als live markiert werden. – sqlchan

Antwort

2

eine Tabelle

DataTable 
    DataKey 
    DataMode 
    Data... 

PK ist DataKey + DATAMODE
Check-Bedingung haben: erste DATAMODE IN ('L', 'D') oder --live Entwurf

Sie fügen mit DATAMODE = 'D' --Draft
wenn es in Betrieb geht, kopieren Sie es in die gleiche Tabelle mit einem INSERT SELECT, setzen Sie DataMode = 'L' immer bearbeiten Sie den DataMode = 'D', und schieben Sie es auf den DataMode = 'L "Wenn damit fertig.

, wenn Sie den Datendurchlauf im Modus angezeigt werden sollen, verwenden WHERE DataKey = @ x AND DATAMODE = @ Modus

Ich bin nicht sicher, wie Sie Löschungen handhaben werden (Entwurf dann, dass Push löschen zu leben ?) Sie können eine Statusspalte hinzuzufügen:

DataStatus --'A'ctive 'D'eleted 

es in einer Tabelle zu tun ermöglicht die gemeinsame Nutzung aller sQL für entweder „L“ ive oder „D'Floß zu arbeiten

0

denke ich. Dies ist ein erstklassiger Kandidat für eine effektive Datierung.Fügen Sie jeder Tabelle ein Start- und Enddatum hinzu, wenn das aktuelle Datum zwischen zwei ist de Anfangs- und Enddatum oder nach dem Startdatum und Ende ist NULL der Datensatz ist live. Alles andere wird nicht als live angezeigt, sodass Sie Ihre Entwurfsdaten haben können.

Dies würde mehr als einen Satz von Entwurfsdaten ermöglichen, wenn die Daten sequenziell sind und ein Verlauf früherer Werte beibehalten werden muss. Wenn Datenvolumina ein Problem darstellen, müssen Sie einen Job ausführen, der zu Zeiten geringer DB-Workload ausgeführt wird, um Datensätze mit einem Enddatum zu löschen, das kleiner als das aktuelle Datum ist.

1

Zwei Ideen, abhängig von den Umständen.

Wenn einige Daten bei der Einführung einer Entwurfsversion aktuell sind und Sie nur neue Daten gleichzeitig wirksam machen möchten, können Sie eine Versionsnummer für jedes Datenelement und eine Konfigurationsoption für die aktuelle aktive Versionsnummer angeben .Schreiben Sie dann die Logik so, dass die ausgewählten Datensätze Versionsnummern < = Aktuelle Versionsnummer haben (höhere Versionsnummern werden ignoriert). Dies würde zu einer geringen Störung führen und vielleicht damit umgehen, was Sie meinen, wenn Sie beide Versionen benötigen.

Wenn Sie ganze Tabellen austauschen möchten und Sie (sehr) kurz die Verbindung trennen können, benennen Sie die Tabellen um. Wahrscheinlich weniger störend als die von Ihnen beschriebenen Optionen, und könnte auch den gleichzeitigen Zugriff ermöglichen.

0

Machen Sie den Schlüssel, was Sie bereits verwenden, und eine boolean is_live Spalte mit Standard N. Wenn Sie veröffentlichen möchten, aktualisieren Sie einfach die Spalte

Mit dieser Arbeit wird Sie zwingen, auf Y. alle Anfragen zu überprüfen so dass sie die Entwürfe ausfiltern, wenn sie nicht gesehen werden sollten, aber es wird Ihnen ersparen, 2 parallele Tabellen mit denselben Formaten und all dem zu verwalten.