小编Car*_*lZA的帖子

在运行时从外部配置文件重新加载配置设置

我正在用C#编写游戏服务器,并希望在服务器运行时从配置文件重新加载或刷新设置.

理想情况下,我想将设置保存在XML文件中,能够在游戏服务器运行时编辑文件,然后向服务器发送命令以从文件重新加载设置.

我知道我也可以使用数据库来做到这一点,但游戏服务器相当小,我认为将设置保存在平面文件中会更实用.我将对服务器将运行的机器进行文件级访问.

我该怎么用?

.net c# configuration configuration-files

14
推荐指数
1
解决办法
2万
查看次数

使用Mongoid的MongoDB会话/私信消息架构

我正在Rails中构建一个论坛系统,以便更熟悉Rails和Mongoid.我想添加的一个功能是用户可以用来互相发送消息的私人消息系统论坛.在架构设计方面,我可以想到两个解决方案:

解决方案1

用户和消息是使用"has_many"和"belongs_to"相互链接的单独文档.

用户文档

has_many:messages_sent,:class_name =>'Message',:inverse_of =>:message_sender

has_many:messages_received,:class_name =>'Message',:inverse_of =>:message_recipient

消息文档

field:created,type:DateTime,default: - > {Time.now}

field:content,type:String

belongs_to:message_sender,:class_name =>'User',:inverse_of =>:messages_sent

belongs_to:message_recipient,:class_name =>'User',:inverse_of =>:messages_received

为了向用户显示他的收件箱,我会查看已some_user.messages_received排序:created并进行过滤,因此我有一个唯一的发件人ID列表,这些列表是在发送最后一封邮件时排序的some_user.

然后,为了显示特定的对话,我只是获取两个参与者之间的所有消息,并根据时间戳交错它们:

messages_in = some_user.messages_received.where(:message_sender => selected_correspondent)

messages_out = some_user.messages_sent.where(:message_recipient => selected_correspondent).

我不喜欢这个解决方案,因为它涉及使用"where"查询多次点击Messages集合以及发送和接收的大量手动过滤和交错消息.努力.

解决方案2(我现在正在使用)

在对话文档中嵌入消息.我将在下面提供用户,消息和对话的代码.会话通过has_and_belongs_to_many(nn,因为用户也可能有很多对话)链接到两个或多个用户.这也可能允许多用户对话.

我喜欢这个解决方案,因为为了向用户显示他的收件箱,我可以使用在Conversation文档中存储和更新的some_user.conversations顺序:last_message_received,不需要过滤.为了显示特定的对话,我不需要交错发送和接收的消息,因为消息已经以正确的顺序嵌入到对话文档中.

此解决方案的唯一问题是当您要添加消息时,找到由两个(或更多)用户共享的正确对话文档.这里建议一个解决方案:mongodb会话系统,但我不喜欢它,因为查询似乎相对昂贵,并且多用户对话的扩展看起来会变得棘手.相反,我在Conversation文档中有一个字段,该字段:lookup_hash是根据参与对话的每个用户的Object ID计算的SHA1哈希.这样,给定两个或更多用户,找到相应的对话文档(或者如果它还不存在则创建它)是微不足道的.

要向对话添加消息,我只使用Conversation.add_message(类方法,而非实例方法,因为对话可能尚不存在),为其提供发件人,收件人和新邮件对象.

我的问题是:考虑到Mongoid(或者一般只是NoSQL)架构设计最佳实践,我做了什么显然是错误的吗?我有什么办法可以改善我的解决方案吗?我使用哈希来查找对话的想法是个坏主意吗?

user.rb

class User
  include Mongoid::Document

  field :username, type: String
  field :joined, type: DateTime, default: ->{ Time.now } …
Run Code Online (Sandbox Code Playgroud)

ruby ruby-on-rails schema-design mongodb mongoid

6
推荐指数
1
解决办法
1421
查看次数