我有一个 json 模式,将几何图形表示为点或多点。每个都是在“定义”中的模式中定义的:
{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "id": "http://schema.my-site.org/geometry.json#",
    "type": "object",
    "oneOf": [
        {
            "allOf": [
                {
                    "required": [
                        "type",
                        "coordinates"
                    ]
                },
                {
                    "oneOf": [
                        {
                            "$ref": "#/definitions/Point"
                        },
                        {
                            "$ref": "#/definitions/MultiPoint"
                        }
                    ]
                }
            ]
        }
    ],
    "definitions": {
        "Point": {
            "title": "Point",
            "type": "object",
            "properties": {
                "type": {
                    "enum": [
                        "Point"
                    ]
                },
                "coordinates": {
                    "$ref": "#/definitions/position"
                }
            }
        },
        "MultiPoint": {
            "title": "MultiPoint",
            "type": "object",
            "properties": {
                "type": {
                    "enum": [
                        "MultiPoint"
                    ]
                },
                "coordinates": {
                    "$ref": …我查看了mongo网站上的大多数mongodb架构设计文章以及SO上的大部分问题.还有一个我还没想到的用例.在查看这些教程时,他们通常会参考文章评论问题和产品/类别问题.我想弄清楚在查询帖子列表时如何建模一对多关系(作者到帖子).以下是示例模式:
Users: {
    _id: ObjectID
    Name: String
    Email: String
}
Posts: {
    _id: ObjectID
    user_id: ObjectID
    body: String
    comments: [
        body: String
    ]
}
现在,假设您要对最近的10个帖子运行查询.一个非常简单的查询,但现在你有一些帖子,每个帖子都有一个指向用户的唯一ObjectID.现在,您应该如何完成获取帖子的每个用户的姓名和电子邮件.
您应该从posts查询创建用户ObjectID的数组,然后运行查询db.users.find({_ id:{$ in:PostsUserIDArray}}); 之后,您会使用您的应用程序逻辑将正确的用户信息与正确的帖子相匹配吗?
您是否应该在帖子中保留数据的副本.IE在posts表中保留用户ID,名称和电子邮件.然后,当用户更新此信息以更新帖子中的所有信息时,只需一个钩子.
我或我的朋友没有想过的选项.
当我尝试围绕mongo数据建模时,我感谢所有的帮助.
我在设计汽车预订申请时需要一些帮助.有一个包含汽车信息的文件(标题,型号,品牌,信息等)
我遇到的问题是:
如何存储可用的预订日期?(我想我可以在数组中使用嵌套的自由日期范围对象)
如何每天存储价格(每天可以单独购买价格)?
预订日和价格可能经常变化.所以第三个问题是:"如何巧妙地(部分地)更新它们,所以我不应该阅读文档,然后存储它".我正在使用update api(http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-update.html)查看脚本解决方案,但它看起来很难看.也许有其他方法?
谢谢,亚历克斯
给定一个模型'A'表,可以有多个子模型'B',其中'B'将有一个或多个子模型'C'......这听起来很简单,但我需要对每个'A'强制执行',任何'B'必须有一个独特的'C'集合..例如,C不能是两个'B'的孩子,它们是同一个父母'A'的一部分..但是'C'可以是一个孩子多个'B'给出每个'B的父'A'是不同的...
这有意义还是我应该对我的场景进行模糊处理?提前喝彩!
请注意,我知道此策略将在应用程序中强制执行,但我不希望数据库处于无效状态.
编辑:大家好,很棒的反馈,所以首先我要感谢大家与我分享你的知识.
为了澄清这种情况,我将解释一下情况,但这里有一些注意事项:
'A'具有零个或多个'B','B'隐含地与'A'相关联,并且因此总是只有一个'A'的孩子.'C'在某种程度上是与许多'B'以及数据库中的其他元素相关联的根实体.
这是真实的故事:
这是一个包含许多简报(A)的网站,许多成员(C),简报可以有很多提交(B),其中提交将始终有一个或多个相关成员.这个想法是提交实际上可以是一种协作,每个成员都没有比其他成员更多的"权力",但是会有一个不同的系统来验证成员如何一起工作的政策.
因此,简而言之,成员只能提交一份提交,而提交可以有许多成员(协作者).
希望有所帮助,但我想你已经给了我很多帮助!
史蒂夫.
我想要一个强制空JSON对象的JSON模式,例如 {}
这是个好主意吗?
我尝试了以下但它允许我在JSON体中输入任何内容:
{
   "description": "voice mail record",
   "type": "object",
   "additionalProperties": false,
   "properties": {
    }
 }
所以我正在为一个论坛创建一个模型。想想线程和一堆评论在哪里。线程有很多评论。在 RDBMS 世界中,我会这样设计
Thread --has many--> Comment
id                   id
user_id              thread_id
                     user_id 
现在,我想,有了这个,数据/模式将遵循许多正常形式之一(我忘记了)。我认为这是最明智的做法。但是,在 NoSQL 世界 (MongoDB) 中执行此操作时,设计这种关系的最佳方法是什么?我几乎可以用 RDBMS 的方式来做,但是我会失去使用嵌入对象的优势。出于某种原因,我更倾向于这样做
Thread
_id
user_id
comments => [{_id, user_id, body, created_at}]
什么是最明智的方式来做到这一点,我想这就是我要问的。为什么?
我正在Rails中构建一个论坛系统,以便更熟悉Rails和Mongoid.我想添加的一个功能是用户可以用来互相发送消息的私人消息系统论坛.在架构设计方面,我可以想到两个解决方案:
用户和消息是使用"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集合以及发送和接收的大量手动过滤和交错消息.努力.
在对话文档中嵌入消息.我将在下面提供用户,消息和对话的代码.会话通过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 } …我正在开发一个ASP.NET Web应用程序,它在客户端使用大量JavaScript,允许用户执行拖放列表重新排序,查找要添加到列表中的项目(如谷歌搜索栏),删除列表中的项目等.
我有一个JavaScript"类",用于存储客户端的每个列表项以及用户对项目执行的操作(添加,编辑,删除,移动)的信息.页面发布到服务器的唯一时间是用户完成时,在页面提交之前,我将有关所做更改的所有信息序列化为JSON并将其存储在页面的隐藏字段中.
我正在寻找的是关于如何在C#中构建我的类的一般建议.我认为在C#中有一个与JavaScript匹配的类可能会很好,所以我可以将JSON去实现这个类的实例.虽然在服务器端有类直接复制JavaScript类,但只存在支持JavaScript UI实现,这似乎有点奇怪.
这是一个抽象的问题.我只是在维护匹配客户端和服务器端对象模型方面做过类似事情的其他人寻求一些指导.
我已经阅读了一些描述重复事件的数据存储方法的论文,但我仍然试图围绕最佳实践进行思考,尤其是关于 MongoDB。
我主要关心的是廉价地检索在给定时间范围内发生的所有事件。我的次要关注是修改和更改单个事件,而不会使整个事件链失控。
看着其他提出类似问题的人,我想出了一种可能性。我并没有完全接受它,并且会喜欢一些正确方向的指示。
我的想法:在每个事件文档中,有...
优点:
缺点/潜在问题:
我有一个 Django 应用程序,它有许多不同的模型,所有模型都有一堆通用数据。最终,我认为这个问题归结为继承和组合之间的决定。我当前的实现是这样的:
\n\nclass Thing(models.Model):\n    foo = models.FooField()\n    bar = models.BarField()\n    type = models.CharField()\n\nclass A(CommonStuff):\n    aFoo = models.FooField()\n\nclass B(CommonStuff):\n    bFoo = models.FooField()\n通过这个模型,我可以查询Thing使用事物模型的管理器。使用 上的 type 字段Thing,我可以通过查看type包含 'a' 或 'b' 的字段,然后询问 (ie) 来获取子对象数据thing.a.aFoo。这是我喜欢的一个功能,因为获取所有Thing对象的列表是我的应用程序中相当常见的操作。
我在这里看到几个问题。首先,这个type领域似乎没有必要。有没有办法无需先查找类型即可获取子数据?似乎我可以使用一个实例方法来解决这个问题,该方法根据给定的类型值返回正确的对象,或者如果我真的想摆脱类型字段,我可以迭代 上的每个反向关系字段,寻找Thing一个这不会引发DoesNotExist异常。但这对我来说感觉很脆弱。如果我添加一个新的 'subthing' C,我必须更新Thing以查找新类型。我可以通过制作Thing和抽象模型来解决这个问题。这样,A就B可以获取 的所有字段Thing,并且避免使用该type字段。但问题是我失去了对所有Thing对象执行查询的能力。
我正在考虑的另一种模型通过将数据转换为和Thing上的字段来翻转这个模型。AB
class Thing(models.Model):\n …schema-design ×10
mongodb ×4
schema ×4
json ×2
jsonschema ×2
c# ×1
composition ×1
database ×1
django ×1
inheritance ×1
javascript ×1
mongoid ×1
mysql ×1
relaxng ×1
ruby ×1