数据库设计(RPG物品增强)

Database Design (RPG Item Enhance)

我正在尝试弄清楚如何创建我的数据库 tables 以便增强项目(+0、+1、...)。

我有:StatType (hp, str, ...) -> ItemStat (ItemId, StatId, Value) <- Item (Id, name, ...)

问题是,我想增强物品,所以我想:

1 - 在 ItemStat(ItemId、StatId、EnhanceLevel、Value)上 问题:我如何确保每个增强级别都为项目的每个属性赋予一个值

2 - 解决问题的一种方法是使用新的 table: ItemBaseStats (ItemId, StatId) 这样就会有项目的所有基本统计信息,而不是在 ItemStat(ItemId, StatId) , EnhanceLevel, Value) 在插入之前我会检查 ItemBaseStats.

问题是,这是 right/a 好的方法吗?我错过了什么?检查应该在数据库端(因此插入将通过 StoredProcedure),它应该在代码中吗?也许两者都有?

问题是我想避免错误,每个增强都必须为每个基本统计数据指定一个值(这是规则)。

顺便说一句,我将 C# 与 EF Core(SQL 服务器)结合使用,因此一切都将通过代码完成,但我需要弄清楚这一点,因为它将改变构建模型的方式并写成)。

首先,通过查看您的 ItemStat table,您正在使用称为 EAV 的设计,实体属性值。我发现的第一个 post 关于它的优缺点是 this one,长话短说,当实体的属性是动态的,但关系数据库(sql server is) 不打算这样做。事实上,我认为关系模型更适合你。

另外请记住,我对 ef-core 完全一无所知,所以这都是从数据库的角度来看的。

为了计算出物品的属性,您需要知道 a) 物品和 b) 它的增强等级。因此,我提议:

1) Item table 你已经拥有了

2) ItemStat table 将有 ItemId 引用 Item.IdEnhanceLevel,而不是你提到的列,有每个可能的统计值一列。 table 的 Primary Key 将是 (ItemID,EnhanceLevel)

即使有很多字段没有值(例如,"defense" 列可能对所有武器都有空值),您也很难创建足够的物品 x 增强级别来制作 table太大,数据库无法处理。

您评论中的示例如下:

[Table Item]
Id, name

Item1, 'Sword of Whosebug'

,

[Table ItemStat]
ItemID, EnhanceLevel, stat1, stat2

Item1, 0, 2, 0
Item1, 1,10, 0
Item1, 2,15, 5

考虑到评论,我建议的 EAV 解决方案是:

完全按照您在“2 -”点中的描述进行操作(即:在 ItemStat 中添加 EnhanceLevel 列),但不需要 ItemBaseStats table。您只需将所有基本统计数据插入 ItemStats 中,其中 EnhanceLevel=0.

我不知道sql。但是,正如您自己在评论中所述,我建议您重新考虑我的第一个答案。 table 的大小,假设有 300 个项目 * 100 个增强级别 =30000 行 * 200 列,对于您的想法来说可能低得令人难以置信(我预计只有几 MB)。并且对它们的读取将使用聚集索引查找,因为每次您肯定都知道该项目及其改进。在我看来,不必加入每次读取所需的所有属性所节省的 CPU 将是最好避免的资源。