Laden...

Datenbank automatisch füllen

Erstellt von OpusDei vor 16 Jahren Letzter Beitrag vor 16 Jahren 2.081 Views
OpusDei Themenstarter:in
98 Beiträge seit 2007
vor 16 Jahren
Datenbank automatisch füllen

verwendetes Datenbanksystem: SQL Server 2005

Hallo,

ich hab mal ne Frage zum automatischen Befüllen einer Datenbank, z.B. via Web Service.
Nehmen wir mal an, ich habe eine Tabelle UMSATZ, die von den Tabellen ZEIT und PRODUKT abhängt. Umsatz sähe, dann in etwa so aus:

Umsatz(UmsatzPK, ZeitFk, ProduktFk, Menge, Betrag, ...)

Alle Keys sind dabei künstliche Zähler.

Ich habe nun also die Information:

2 Stück Butter für 1€ verkauft zum Zeitpunkt "DateTime.Now".

Sorry wenn die Frage bissl doof rüber kommt, aber wie würde man das jetzt am elegantesten in die DB bringen. Also in welcher Reihenfolge der Schritte und auf welcher Seite der WS-Verbindung würde man zB das Produkt in den ProduktKey ummappen? Auch muss ja das Datetime.Now in die ZeitTabelle geschrieben werden, damit es einen Key bekommt, den ich dann in der Umsatztabelle benutzen kann. Wie verhindere ich, dass der selbe WS von nem anderen Benutzer den selben Eintrag macht und einen anderen Key bekommt? Kann ja ab einer gewissen Nutzerfrequenz schon vorkommen. ?(

Hoffe (bezweifle aber X( ) is halbwegs klar geworden. Bin irgendwie selber noch unschlüssig, was die genauen Anforderungen sein sollen. Vielleicht könnte Ihr mir ja mit ein paar Denkanstößen aus der Praxis den Findungsprozess abkürzen.

Danke schonmal für alles, was da kommen mag 🙂

2.187 Beiträge seit 2005
vor 16 Jahren

Mein erster Vorschlag wäre:
Umsatz(UmsatzPK:Zeit,ProducktFK,Menge,Betrag,...)
!! Zeit ist kein Fremdschlüssel, da Zeit ja nur ein Wert ist und eine Normalisierung hier zuviel Leistung und so kostet !!

Wenn ein Produkt zu einem Zeitpunkt nur einmal einen Umsatz generieren darf, kann würde ich noch einen Uniqu-Constraint setzen: UNIQUE(Zeit,ProducktFK)

Gruß
Juy Juka

M
402 Beiträge seit 2005
vor 16 Jahren

Hi!

Ganz verstanden hab ich's nicht... aber na gut...

Ich hab mal ein paar Fragen, vielleicht wird Dir
bei der Beantwortung selber schon einiges klarer....

Warum gibt es eine Tabelle "Zeit"?
Anm:
Mmn besteht zwischen dem "Umsatz" und dem Zeitpunkt an dem der Umsatz
generiert wird eine 1:1 - Beziehung (die selben 2 Butter kannst nicht nochmal
um den selben einen Euro verkaufen). Ergo würd ich wenns keine wirklich guten
Gründe dafür gibt den Zeitpunkt direkt in die Tabelle "Umsatz" schreiben.

Wieso sollte man das Produkt auf die ProduktID ummappen müssen?
_Anm:
Normalerweise hat man ja irgendeine "Liste" in der man das Produkt auswählen
kann. Der zugrundeliegende Wert ist doch dann schon die ProduktID und diese wird
an das WS übergeben.... Ich versteh hier das Problem nicht.... _

...jetzt bist Du mal dran 👅

lg

OpusDei Themenstarter:in
98 Beiträge seit 2007
vor 16 Jahren

Eine mögliche Lösung, die ich mir vorstellen kann (mit Beispielen), wäre:

  1. Werte ermitteln
    Menge:2, Betrag:1, Produkt:Butter, Zeit:Now

  2. Tabelle ermitteln (wie auch immer)
    TabUmsatz

  3. Schema der Tabelle ermitteln
    UmsatzID:int, ZeitID:int, ProduktID:int, Menge:int,Betrag:money

  4. Verknüpfte Tabellen ermitteln (tja da wüsste ich schon nicht, mehr wie)
    ?

  5. Alle Werte, die in den verknüpften Tabellen vorkommen in den entsprechenden Key ummappen zB public int GetKey(string Wert, string Tabelle)
    Butter -> 4, Now -> next Index

  6. Ein Tupel aus TabellenID, FremdschlüsselIDs und Werten zusammenbauen (string[]) und als Parameter einer WriteDatabase(string[] Werte) Methode übergeben

OpusDei Themenstarter:in
98 Beiträge seit 2007
vor 16 Jahren

Ok ich seh schon Zeit is bissl fraglich. Kann man getrost rausnehmen. Soll mal ein Data Warehouse werden, da macht sich ne Zeitdimension immer gut. Aber man kann den Umsatz ja auch von anderen lustigen Dingen abhängig machen:

Mitarbeiter, Produkt, Region

2.187 Beiträge seit 2005
vor 16 Jahren

Das musst du dann entscheiden, ob bereits die Daten so zusammen gefasst sind, oder ob diese erst bei der Auswertung (View, Programm, Report, ...) errechnet werden.

Ich würde zu letzterem tendieren.

OpusDei Themenstarter:in
98 Beiträge seit 2007
vor 16 Jahren

Ok ich glaube ich kann die Frage schonmal etwas eingrenzen.

  1. Wie bekomm ich das Schema (Namen, Typen, Constraints) einer Tabelle?
  2. Wie ermittel ich die Ursprungstabellen von Fremdschlüsseln?
J
3.331 Beiträge seit 2006
vor 16 Jahren

[FAQ] Tabellen- und Spalteninformationen aus dem SQL Server auslesen

:rtfm: Ausgehend von DbConnection.GetSchema-Methode die Erläuterungen unter "Abrufen von Schemainformationen aus einer Datenbank".

:rtfm: **DataRelation-Klasse **

Oder WriteXmlSchema() und die xsd-Datei untersuchen

Gruß Jürgen

OpusDei Themenstarter:in
98 Beiträge seit 2007
vor 16 Jahren

🙂 Danke, werd mir das mal alles reinziehen

OpusDei Themenstarter:in
98 Beiträge seit 2007
vor 16 Jahren

Also ich hab mir conn.GetSchema mal angeschaut. Eine Menge Informationen lassen sich da sicherlich gewinnen, allein ich bin nicht sicher, ob auch für mich das richtige dabei ist.

<CollectionName>ForeignKeys</CollectionName> und <CollectionName>Restrictions</CollectionName> klangen erstmal sehr gut. Heraus kam dabei dann zB:

XML:
<ForeignKeys diffgr:id="ForeignKeys4" msdata:rowOrder="3" diffgr:hasChanges="inserted">
<CONSTRAINT_CATALOG>asdf</CONSTRAINT_CATALOG>
<CONSTRAINT_SCHEMA>dbo</CONSTRAINT_SCHEMA>
<CONSTRAINT_NAME>FK_Kunde_Umsatz</CONSTRAINT_NAME>
<TABLE_CATALOG>asdf</TABLE_CATALOG>
<TABLE_SCHEMA>dbo</TABLE_SCHEMA>
<TABLE_NAME>Umsatz</TABLE_NAME>
<CONSTRAINT_TYPE>FOREIGN KEY</CONSTRAINT_TYPE>
<IS_DEFERRABLE>NO</IS_DEFERRABLE>
<INITIALLY_DEFERRED>NO</INITIALLY_DEFERRED>
</ForeignKeys>

und

XML:
<Restrictions diffgr:id="Restrictions1" msdata:rowOrder="0">
<CollectionName>Users</CollectionName>
<RestrictionName>User_Name</RestrictionName>
<ParameterName>@Name</ParameterName>
<RestrictionDefault>name</RestrictionDefault>
<RestrictionNumber>1</RestrictionNumber>
</Restrictions>

Meinem Ziel, von einer Tabelle auf die per FK mit ihr verknüpften Tabellen zu schließen, sehe ich mich mit diesen Informationen aber nicht näher.

Zur DataRelation-Klasse, soweit ich das verstehe kann ich damit selber im DataSet Constraints aufbauen. Ich will aber bestehende Constraints auswerten! Dabei ist mir aufgefallen, dass ich zwar mit mehreren selects und DataAdapter.Fill eine Menge an Tabellen in mein DataSet laden kann, nur die Relations kommen nicht mit!? Oder seh ich da was falsch.

Und nochmal grundsätzlicher. Ich bin ja bestimmt nicht der erste, der eine Tabelle füllen will, die mit anderen Tabellen verknüpft ist. Da muss es doch eine best Practice geben. Is doch immer Grunde Tageschgeschäft für nen DB Client Coder. Also vielleicht drück ich mich hier nur zu kompliziert aus:

Wie befüll man eine Tabelle, die eine Anzahl von FK_Relations besitzt?

Danke für Eure Tipps 😉

J
3.331 Beiträge seit 2006
vor 16 Jahren

Original von OpusDei
Ich bin ja bestimmt nicht der erste, der eine Tabelle füllen will, die mit anderen Tabellen verknüpft ist. Da muss es doch eine best Practice geben. Is doch immer Grunde Tageschgeschäft für nen DB Client Coder.

Naja, ich denke, genau dafür wurde das typisierte Dataset "erfunden". Da holt man sich einmal alle Strukturen aus der Datenbank und hat (je nach Arbeitsumgebung) mehr oder weniger schnell alle Tabellen, Spalten, Constraints, ForeignKeys.

Visual Studio macht das (wenn ich das richtig mitbekomme - ich arbeite nicht damit) meistens automatisch, wenn eine DbConnection vorbereitet wird.

Ich habe für Firebird mein Tool: CreateTypedDataset erstellt.

Wenn ein Dataset schon vorhanden ist, kann sich mit WriteXmlSchema eine xsd-Datei erstellen (wie schon erwähnt). Für andere Fälle schreibe ich sie mir selbst "von Hand" und füge die gewünschten Constraints und ForeignKeys hinzu. (Ein Blick in eine Muster.xsd lässt die Struktur schnell erkennen und verstehen und leicht nachbauen.) Danach erhält man mit dem NET-Tool xsd.exe das typisierte Dataset.

Entwicklerherz, was willst Du mehr! Jürgen

PS. Als ich Dir die Hinweise zur Lektüre gab, war mir klar, dass damit viele Informationen geliefert werden. Aber wenn Du solche "tiefschürfenden" Aufgaben erledigen willst, brauchst Du natürlich auch solche Anleitungen.

OpusDei Themenstarter:in
98 Beiträge seit 2007
vor 16 Jahren

Danke für den Tipp. Hatte zwar schon vom typisierten DS gehört es aber noch nicht, als für mich relevant erachtet. Dann werd ich mich wohl mal in die Materie reinwühlen. 👍