2016-06-07 3 views
2

Я пытаюсь найти хорошую модель для (что я считаю) несколько сложного класса. Существуют две сущности, независимые друг от друга (в том смысле, что они используют сами по себе, в другом месте приложения), группу пользователей и тип события.Моделирование данных в C#

Группа пользователей имеет список типов событий, на которые они имеют право. И кроме того, существует список строк, который применяется к каждой комбинации группы пользователей и события, которая сообщает строкам приложения заменить позже (поэтому словарь, где они являются ключом, является заменяемым полем, а значение - это значение для его замены с).

Я исхожу из большего количества фона SQL, поэтому мне легко думать в терминах таблиц и первичных ключей. Эта структура будет ключом от UserGroupID, EventTypeID, NameToReplace, но когда я пытаюсь придумать способ сделать это в C#, я в конечном итоге с уродливым (или, по крайней мере, я думаю, что они уродливы) структур, как Dictionary<int, Dictionary<tuple<int, string>, string>> или Dictionary<int, Dictionary<int, Dictionary<string, string>>>

I также может покончить с понятием словаря и просто составить список кортежей или список пользовательских классов, которые связывают все логические «ключи» вместе.

Мои вопросы (ы) сводятся к тому, является ли такая структура вложенной коллекции общей и/или хорошей идеей? Существуют ли лучшие методы при моделировании данных, подобных этим, на которые может меня навестить?

Заранее благодарен!

+0

Не мог бы вы объяснить более подробно, что классовая структуру вы думали о? –

+1

"список пользовательских классов, которые связывают все логические" ключи "вместе. Это было бы самое чистое решение. Маленький код впереди, чтобы избежать необходимости использовать словари и кортежи. –

+0

@DStanley Спасибо за предложение. Знаете ли вы, что есть много/любой удар производительности, если у вас есть словарь с ключом от объекта, а не что-то вроде 'int'? Или это действительно сводится к тому, как вы переопределяете 'Equals()'? – Xedni

ответ

0

Так, это может быть спорным, но я хотел поставить эту версию на обсуждение, чтобы узнать, насколько уместно этот подход будет.

Предполагая, что вы не имеете миллионы групп и типов событий, вы могли бы упаковать те в виду Составной ключ в БД с точки зрения битов сдвига:

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

Тогда Dictionary<int, string> будет работать нормально.

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

И получить значение:

dictionary[Combine(UserGroupID, EventTypeID)] // Or TryGetValue() 
Смежные вопросы