Laden...

Forenbeiträge von temilun Ingesamt 6 Beiträge

16.08.2011 - 11:54 Uhr

Danke für die Antworten. Ich hatte gehofft, dass es eine total simple Lösung gibt, die mir nur noch nicht eingefallen ist. Jetzt werde ich mich halt mal dran machen, meine Struktur aufzubauen und schau mal wie ich damit weiter kommen. "EAV/CR" hilft schon mal als Begriff, um noch mal etwas zu googlen.

Gruß,
Temilun

15.08.2011 - 08:39 Uhr

verwendetes Datenbanksystem: Firebird

Hallo,

Ich bin grad etwas unsicher, wie ich meine DB strukturieren soll. Ich möchte Artikel speichern, die allerdings völlig unterschiedliche "Eigenschaften" haben können, z.B.:

Mainboard: Hersteller, Prozessorsockel, Onboard-Grafik, usw.
Festplatte: Hersteller, Bus, Kapazität
USB-Leitung: Länge

Ich kann ja jetzt schlecht für alle möglichen Eigenschaften ein Feld anlegen, von denen dann die meisten leer sind.

Eine Möglichkeit wäre es, die Artikel mit ihren Grunddaten in einer Tabelle zu halten und daneben eine weitere Tabelle mit den Eigenschaften zu den Artikeln, a la:

Artikel
Id
KategorieId
Hersteller

ArtikelEigenschaft
ArtikelId
Typ(Id)
Value

Da ich natürlich nicht jeden x-beliebigen Datentypen freigeben will, würde das dazu führen, dass ich noch eine Tabelle "ArtikelTypen" anlegen muss, die die verfügbaren Typen enthält und eine Tabelle "ArtikelKategorie", die die Information enthält, welche Eigenschaften für welche Kategorie verfügbar sind. Das wird ja recht aufwändig.

edit:

Eine andere Möglichkeit wäre in der Artikeltabelle in einem varchar-Feld die Eigenschaften z.B. als CSV zu speichern. Damit ist dann allerdings die Suche über Eigenschaften nicht mehr ganz angenehm.

Gibt es noch eine bessere Lösung dafür? Das Problem kann ja nicht ganz neu sein, siehe einen der vielen Online-Shops mit entsprechender Artikel-DB.

Ich denke sogar drüber nach auf eine Dokumenten-DB (z.B. RavenDB) setzen, da bin ich flexibel.

Gruß,
Temilun

14.08.2011 - 09:39 Uhr

Keine Ahnung ob das gut ist, aber ich mach das so:

-Project.Module1
-Project.Module2
-Project...
-Project.Shared
-Project.Dal

In Shared sind die Interfaces, Entities usw. auf die alle den Zugriff brauchen und die von allen referenziert wird. Der Rest läuft über DI.

14.08.2011 - 09:27 Uhr

"Ausliefern" ist vielleicht etwas hochtrabend formuliert. Ich dachte ich kopiere es einfach auf einen USB-Stick und installiere es von da aus.

Ok. Ich hab in der Zwischenzeit mal etwas mit meinem Ansatz herumgespielt und u.a. auch mal ein paar hunderttausend Id's erzeugt. Das scheint recht gut zu funktionieren und ergibt am Ende einen Barcode von 12 Zeichen, der mit Code128 ganz gut auf einem Etikett Platz hat.

Hat vielleicht noch jemand einen Code, um an die Seriennummer der Festplatte zu kommen? Ich verwende jetzt "GetVolumeSerial" aus der kernel32.dll. Nachdem was ich im web gefunden habe ist das aber wohl nicht die Hardware-Seriennummer. Ansonsten wird immer auf WMI hingewiesen, was mir nicht so gefällt, weil ich was möglichst allgemeingültiges haben möchte.

Naja, mit der derzeitigen Lösung funktioniert es vermutlich auch ausreichend gut.

Danke,
temi

03.08.2011 - 21:11 Uhr

@herbivore

Wir reden von deutlich unter 100 Installationen, vielleicht an die 20.

@winsharp93

Ich möchte umständlichen Installationsschnickschnack möglichst vermeiden. Dazu zähle ich Sticks, Netzwerkanmeldungen vor der ersten Nutzung usw.

Darum habe ich auch die Idee verworfen bei der Installation eine Art SystemId einzugeben / anzulegen verworfen. Obwohl ich mir grad gut vorstellen kann, einfach beim ersten Start eine GUID zu erzeugen und in einer .config abzulegen (oder auch in der Datenbank).

Natürlich könnte ich einfach hochzählen, aber dazu müsste ich irgendwo eine Variable haben, die ich mit jedem Anlegen einer Id hochzählen kann. Da kommt mir das Hashen einer GUID irgendwie einfacher.

Ach ja, ich habe jetzt auch damit etwas herumexperimentiert und mit dem MurMurHash (32bit) käme ich auch mit der Gesamtlänge der Id (als druckbarer String) hin. Da bin ich gerade bei 12 Zeichen, wenn ich nämlich von der "SystemId" (der erste Teil) nur 16 Bit verwende.

03.08.2011 - 18:38 Uhr

Hallo,

ich bin Hobbyprogrammierer und habe folgendes Problem:

Die Software ist auf mehreren Rechner installiert und speichert ihre Daten jeweils in einer lokalen DB ab. Ein Server ist (zumindest derzeit nicht verfügbar), allerdings muss es möglich sein die Daten zwischen den verschiedenen Installationen synchronisieren zu können.

Insofern wäre eine GUID als Schlüssel für die DB die erste Wahl, allerdings möchte ich auch ein Barcodelabel für jeden "Artikel" drucken und dazu ist eine GUID einfach zu lang. Der Barcode sollte also maximal 16 Zeichen lang sein. Idealerweise soll natürlich die ID gleich dem Barcode sein, weil dieser ja auch eindeutig sein muss.

Meine Idee dazu ist jetzt eine zusammengesetzte ID zu generieren:

  1. Eine ID, die irgendwie dem Rechner zugeordnet ist, auf dem die Software installiert ist (z.B. die Festplatten-ID, bzw. ein Teil davon oder ein Hash davon)
  2. Ein 32-Bit-Hash aus einer GUID.

Kollisionen des 2. Teils könnte ich so auf dem jeweiligen Rechner behandeln und durch den 1. Teil wäre sicher gestellt, dass die ID auch im Gesamtsystem eindeutig bleibt.

Mit zwei 32-Bit-Hashes käme ich damit auf eine ID/Barcode mit einer Gesamtlänge von 16 Zeichen.

Was ist von dieser Idee zu halten, bzw. hat jemand einen besseren Ansatz?