数据库设计(RPG项目增强)

时间:2018-11-07 11:25:43

标签: c# sql-server database-design ef-core-2.1

我正在尝试弄清楚如何制作数据库表以具有增强项(+ 0,+ 1,...)。

我所拥有的:StatType(hp,str,...)-> ItemStat(ItemId,StatId,Value)<-Item(Id,名称,...)

问题是,我想增强功能,所以我坚强:

1-在ItemStat(ItemId,StatId,EnhancedLevel,Value)上     问题:如何确保每个增强等级为物品的每个属性赋予一个值

2-解决问题的一种方法是拥有一个新表:ItemBaseStats(ItemId,StatId),因此将具有该项目的所有基本统计信息,并且比之前的ItemStat(ItemId,StatId,EnhancedLevel,Value)插入,我将检查ItemBaseStats。

问题是,这是正确/很好的方法吗?我想念什么?检查应该在数据库方面(因此插入将通过StoredProcedure执行),是否应该在代码中进行?也许两者都是?

我想避免错误,并且每个增强功能都必须为每个基本统计信息指定一个值(这是规则)。

顺便说一句,我将C#与EF Core(SQL Server)一起使用,因此一切都将通过代码完成,但是我需要弄清楚这一点,因为它会改变模型的构建和编写方式。”

1 个答案:

答案 0 :(得分:1)

首先,通过窥视ItemStat表,您正在使用一种称为EAV的设计,即Entity-Attribute-Value。我发现的关于此方法的优缺点的第一篇文章是this one,长话短说,当实体的属性是动态的,但是关系数据库(即sql server)并不意味着它很有用。去做这个。实际上,我认为关系模型会适合您。

还请记住,我一点也不了解ef-core,所以从数据库的角度来看都是这样。

为了弄清楚一个项目的统计信息,您需要知道a)该项目和b)其增强级别。因此,我建议:

1)您已经拥有的Item

2)ItemStat表中将有ItemId引用Item.IdEnhanceLevel,并且,除了您提到的列之外,每个可能的统计信息都有一个列值。该表的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-”点中描述的内容进行操作(即:在ItemStat中添加EnhanceLevel列),但是不需要ItemBaseStats表。您只需将所有基本统计信息插入ItemStats中,其中EnhanceLevel = 0。

我不懂nosql。但是,正如您自己在评论中指出的那样,我建议您重新考虑我的第一个答案。假设一个表的大小为300项* 100个增强级别= 30000行* 200列,对于您可能要记住的内容来说,这可能是令人难以置信的低(我希望有几MB)。而且,每次您当然都知道项目及其增强功能时,对它们的读取将使用聚簇索引查找。我认为,不必每次读取都需要加入所有属性所节省的CPU,将是避免使用的首选资源。