Прежде всего, взглянув на свою таблицу ItemStat
, вы используете дизайн под названием EAV, Entity-Attribute-Value. Первый пост, который я нашел о плюсах и минусах этого, этот , и, короче говоря, он может быть полезен, когда атрибуты сущности являются динамическими, но реляционными базами данных (какой сервер sql является) не предназначены для этого. И действительно, я думаю, что вместо этого вам подойдет реляционная модель.
Также имейте в виду, что я совсем не знаю ef-core, так что это все с точки зрения базы данных.
Чтобы выяснить характеристики предмета, вам необходимо знать а) предмет и б) уровень его улучшения. Таким образом, я предлагаю:
1) Таблица Item
, как у вас уже есть
2) Таблица ItemStat
, которая будет иметь ItemId
, ссылающуюся на Item.Id
, EnhanceLevel
и вместо упомянутых вами столбцов, имеет один столбец для каждого возможного значения статистики. Primary Key
этой таблицы будет (ItemID,EnhanceLevel)
.
Даже если есть много полей без значения (например, столбец «защита» имеет нулевое значение для всех видов оружия), вы вряд ли создадите достаточно элементов x уровней улучшения, чтобы сделать таблицу, которая будет слишком большой для обработки базой данных.
Пример в вашем комментарии будет выглядеть так:
[Table Item]
Id, name
Item1, 'Sword of StackOverflow'
[Table ItemStat]
ItemID, EnhanceLevel, stat1, stat2
Item1, 0, 2, 0
Item1, 1,10, 0
Item1, 2,15, 5
Учитывая комментарии, EAV-решение, которое я бы предложил:
Делайте в точности то, что вы описываете в своей точке "2 -" (т.е. добавьте столбец EnhanceLevel в ItemStat), но нет необходимости в таблице ItemBaseStats. Вы просто вставите все базовые характеристики в ItemStats, где EnhanceLevel = 0.
Я не знаю nosql. Однако, как вы сами заявили в комментарии, я бы предложил пересмотреть мой первый ответ. Размер таблицы, скажем, 300 элементов * 100 уровней улучшения = 30000 строк * 200 столбцов, возможно, будет невероятно низким для того, что вы можете иметь в виду (я ожидаю несколько МБ). И для чтения по ним будет использоваться поиск по кластерному индексу, поскольку каждый раз вы наверняка знаете как элемент, так и его усовершенствование. По моему мнению, процессор, сэкономленный благодаря тому, что ему не нужно присоединяться ко ВСЕМ атрибутам, необходимым при каждом чтении, будет предпочтительным ресурсом, которого следует избегать.