2016-06-07 11 views
2

Ich versuche, ein gutes Modell für (was ich würde halten) eine etwas komplizierte Klasse. Es gibt zwei Entitäten, die voneinander unabhängig sind (insofern sie an anderer Stelle in der App verwendet werden), eine Benutzergruppe und einen Ereignistyp.Modellieren von Daten in C#

Eine Benutzergruppe hat eine Liste von Ereignistypen, zu denen sie berechtigt sind. Darüber hinaus gibt es eine Liste von Strings, die für jede Kombination von User Group und Event gilt und die App-Strings später ersetzt (also ein Dictionary, bei dem der Schlüssel ein zu ersetzendes Feld ist und der Wert der zu ersetzende Wert ist) mit).

Ich komme aus mehr von einem SQL-Hintergrund, so dass es für mich leicht ist, in Bezug auf Tabellen und Primärschlüssel zu denken. Diese Struktur würde UserGroupID, EventTypeID, NameToReplace verkeilte ausgeschaltet werden, aber wenn ich versuche, einen Weg zu kommen es in C# zu tun, ich am Ende mit hässlichen (oder zumindest ich denke, sie sind hässlich) Strukturen wie Dictionary<int, Dictionary<tuple<int, string>, string>> oder Dictionary<int, Dictionary<int, Dictionary<string, string>>>

I könnte auch das Wörterbuch-Konzept zu beseitigen und nur eine Liste von Tupeln, oder eine Liste von benutzerdefinierten Klassen, die alle logischen "Schlüssel" zusammenbinden.

Meine Frage (n) kommen zu, ist diese Art von verschachtelten Sammlung Struktur üblich und/oder eine gute Idee? Gibt es Best Practices bei der Modellierung von Daten, auf die mich jemand verweisen kann?

Vielen Dank im Voraus!

+0

Können Sie näher erläutern Sie bitte, welche Klassenstruktur Sie gedacht haben? –

+1

"Liste der benutzerdefinierten Klassen, die alle logischen" Schlüssel zusammen "binden" Das wäre die sauberste Lösung. Ein wenig Code im Voraus, um zu vermeiden, dass man lose Wörterbücher und Tupel lesen muss. –

+0

@DStanley Danke für den Vorschlag. Weißt du, ob es viel/irgendeinen Leistungseinbruch gibt, wenn man ein Wörterbuch von einem Objekt abschneidet, im Gegensatz zu etwas wie einem "int"? Oder kommt es wirklich darauf an, wie Sie 'Equals()' überschreiben? – Xedni

Antwort

0

Also, das könnte umstritten sein, aber ich wollte diese Version zur Diskussion stellen, um zu wissen, wie geeignet dieser Ansatz wäre.

Angenommen, Sie haben nicht Millionen von Gruppen und Ereignistypen, könnten Sie diese in Art von Composite-Key in db Bedingungen mit Bits Pack verschieben:

public static int Combine(int value1, int value2) 
{ 
    return value1 | (value2 << 8); 
} 

Dann Dictionary<int, string> gut funktionieren würde.

dictionary.Add(Combine(UserGroupID, EventTypeID), NameToReplace) 

Und um den Wert zu erhalten:

dictionary[Combine(UserGroupID, EventTypeID)] // Or TryGetValue() 
Verwandte Themen