Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 数据库设计(RPG项目增强)_C#_Sql Server_Database Design_Ef Core 2.1 - Fatal编程技术网

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

C# 数据库设计(RPG项目增强),c#,sql-server,database-design,ef-core-2.1,C#,Sql Server,Database Design,Ef Core 2.1,我正试图弄清楚如何创建数据库表,以便有增强项(+0,+1,…) 我拥有的:StatType(hp,str,…)->ItemStat(ItemId,StatId,Value)首先,通过查看ItemStat表,您正在使用一个名为EAV的设计,即实体属性值。我发现的第一篇关于这种方法的利弊的文章是,长话短说,当实体的属性是动态的时,它可能会很有用,但关系数据库(sql server)并不打算这样做。事实上,我认为关系模型更适合你 还要记住,我根本不了解ef core,所以这都是从数据库的角度来看的 为

我正试图弄清楚如何创建数据库表,以便有增强项(+0,+1,…)


我拥有的:StatType(hp,str,…)->ItemStat(ItemId,StatId,Value)首先,通过查看
ItemStat
表,您正在使用一个名为EAV的设计,即实体属性值。我发现的第一篇关于这种方法的利弊的文章是,长话短说,当实体的属性是动态的时,它可能会很有用,但关系数据库(sql server)并不打算这样做。事实上,我认为关系模型更适合你

还要记住,我根本不了解ef core,所以这都是从数据库的角度来看的

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

1)
表,因为您已经有了它

2)
ItemStat
表将有
ItemId
引用
Item.Id
EnhanceLevel
,并且不是您提到的列,而是每个可能的stat值有一列。该表的
主键将是
(ItemID,EnhanceLevel)

即使有许多字段没有值(例如,可能列“defense”对所有武器都有空值),您也很难创建足够的项x enhancementlevels来创建一个对数据库来说太大而无法处理的表

您评论中的示例如下:

[Table Item]
Id, name

Item1, 'Sword of StackOverflow'
,


考虑到这些意见,我建议的EAV解决方案是:

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


我对nosql一无所知。然而,正如你自己在评论中所说,我建议你重新考虑我的第一个答案。一个包含300个项目*100个增强级别=30000行*200列的表的大小可能会低到难以置信的程度(我希望是几MB)。它们的读取将使用聚集索引查找,因为每次您肯定都知道该项及其增强。在我看来,由于不必加入每次读取所需的所有ATIBUTE而节省的CPU将是最好避免的资源。

因此,增强级别会影响多个状态类型,对吗?它们对所有物品的影响是一样的吗?例如,对于所有物品,增强等级1会带来+50%的生命,或者是对于物品1和物品2,相同等级的生命增强会不同吗?是的(这就是为什么我想到一个包含物品所有基本统计信息的表),但是它们与增强不同(不是乘数),所以让我们说,物品1,有2个统计数据,所以Item1(stat1,enhancelevel0,2)Item1(stat1,enhancelevel1,10)Item1(stat1,enhancelevel2,15)和Item1(stat2,enhancelevel0,0)Item1(stat2,enhancelevel1,0)Item1(stat2,enhancelevel3,5)您好,谢谢您的建议,但我不能使用这种方法(我不是在开发一个游戏,我只是想为一个现有的游戏创建一个数据库,用于学习和一些工具),这种方法是一个问题,因为有些项目有13个统计信息(例如,有些独特的事件项目有更多).我完全可以看到你建议的方法的优势,这是一个非常好的主意,我可以申请一些其他的东西,但对于这个特殊的情况,这不是一个解决方案。13个统计数据有什么问题吗?我看到了许多50列的生产表。如果是计算资源让你兴奋,你考虑过h的利弊吗少加入一个?问题是,我可以给你一个确切的数字,在这种情况下,我会有1列每个现有的统计数据,总共有120个不同的统计数据。随着开发人员发布新内容,这个列表会继续增长。好的,我也会添加一个EAV解决方案。谢谢,顺便问一下,这一切值得吗,还是只需要一个NoSQL数据库(但就我目前所读到的内容而言,像CosmosDB这样的NoSQL对于非常高的写入/读取频率是很好的,但在这种情况下,它将有大量的读取,但在初始设置之后几乎不存在写入。这看起来像是关系数据库,或者可能是两者的混合??
[Table ItemStat]
ItemID, EnhanceLevel, stat1, stat2

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