我一直在从事一个使用 MongoDB 数据库层的 Web 项目。我有一个无法正确映射到文档数据库的特定实体,我认为获得一些反馈会更好。
比如说,我有用户和项目集合。用户可以喜欢或不喜欢项目。项目中也有标签,用户也可以喜欢或不喜欢标签。我需要能够足够快地查找喜欢/不喜欢的计数。
我想出的是这样的(对于项目):
{
name: "Item Name",
statistics : {
likes: 5,
dislikes: 6
},
tags: [
{ name: "Foo", likes: 10, dislikes: 20 },
{ name: "Bar", likes: 5, dislikes: 1 }
]
}
这还不错。但问题是,我需要知道用户是否喜欢/不喜欢某个标签或项目。现在,我想到的是这样的:
{
name: "Item Name",
statistics : {
likes: 5,
dislikes: 6
},
tags: [
{
name: "Foo",
likes: 2,
dislikes: 1,
votes: [
{ user: "user1_id", vote: 1 }, //like
{ user: "user2_id", vote: 1 }, //like
{ user: "user3_id", vote: -1 }, //dislike
]
},
{
name: "Bar",
likes: 0,
dislikes: 0,
votes: []
}
]
}
这看起来很有希望,我在这里看到的最大好处是,如果有人改变主意并且不喜欢他以前喜欢的东西,我可以进行原子更新。
但是,我希望每个项目中有大约 10 个标签,每个标签可能有 100 票。然后每个项目都有大约 1000 个嵌套的投票对象。我知道 mongodb 可以处理 16mb 的文档,但仍然可以在一个文档中存储这么多数据吗?
我应该选择标准化模型吗?也许有一个“tagvotes”集合和一个 itemvotes 集合?实际上对我来说感觉更自然。
如果我在考虑关系性的还是理性的,只是徘徊?
谢谢。
最佳答案
在某些时候,随着 M 和 N 的增长,尝试将所有内容嵌入任何 M x N 类型的情况中变得不可能。在你达到那个点之前,你需要创建一个单独的集合并进行客户端连接;但这并不意味着您必须完全规范化所有内容。
在这种情况下,请考虑您希望向用户显示哪些 View :很明显,您将希望显示该项目、它有多少喜欢和不喜欢以及应用到它的标签集以及每个标签的受欢迎程度这些标签是。但是喜欢/不喜欢该对象以及喜欢/不喜欢每个标签的用户的实际列表可以进入单独的文档(在单独的集合中)。
使用这样的模式,您可以执行一个查询来获取项目以及您需要在该项目旁边显示的所有内容。然后,如果您需要它,只需再查询一次即可获取当前用户对该项目的意见以及他们投票的所有与该项目相关的标签。
关于c# - MongoDB 文档架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8262756/
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha
matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
Ruby有一些不错的文档生成器,例如Yard、rDoc,甚至Glyph。问题是Sphinx可以做网站、PDF、epub、LaTex等。它在重组文本中完成所有这些事情。在Ruby世界中有替代方案吗?也许是程序的组合?如果我也能使用Markdown就更好了。 最佳答案 自1.0版以来,Sphinx有了“域”的概念,它是从Python和/或C以外的语言标记代码实体(如方法调用、对象、函数等)的方法。有一个rubydomain,所以你可以只使用Sphinx本身。您唯一会缺少的(我认为)是Sphinx使用autodoc从源代码自动创建文档
我是一名决定学习Ruby和RubyonRails的ASP.NETMVC开发人员。我已经有所了解并在RoR上创建了一个网站。在ASP.NETMVC上开发,我一直使用三层架构:数据层、业务层和UI(或表示)层。尝试在RubyonRails应用程序中使用这种方法,我发现没有关于它的信息(或者也许我只是找不到它?)。也许有人可以建议我如何在RubyonRails上创建或使用三层架构?附言我使用ruby1.9.3和RubyonRails3.2.3。 最佳答案 我建议在制作RoR应用程序时遵循RubyonRails(RoR)风格。Rails
我怀念ipython的一件事是它有一个?为特定功能挖掘文档的运算符。我知道ruby有一个类似的命令行工具,但是我在irb中调用它非常不方便。ruby/irb有类似的东西吗? 最佳答案 Pry是IPython的Ruby版本,它支持?命令来查找有关方法的文档,但语法略有不同:pry(main)>?File.dirnameFrom:file.cinRubyCore(CMethod):Numberoflines:6visibility:publicsignature:dirname()Returnsallcomponentsofthef
我如何做Ruby方法"Flatten"RubyMethod在C#中。此方法将锯齿状数组展平为一维数组。例如:s=[1,2,3]#=>[1,2,3]t=[4,5,6,[7,8]]#=>[4,5,6,[7,8]]a=[s,t,9,10]#=>[[1,2,3],[4,5,6,[7,8]],9,10]a.flatten#=>[1,2,3,4,5,6,7,8,9,10 最佳答案 递归解决方案:IEnumerableFlatten(IEnumerablearray){foreach(variteminarray){if(itemisIEnume
我正在尝试使用nokogirigem提取页面上的所有url及其链接文本,并将链接文本和url存储在散列中。FooBar我想回去{"Foo"=>"#foo","Bar"=>"#bar"} 最佳答案 这是一个单行:Hash[doc.xpath('//a[@href]').map{|link|[link.text.strip,link["href"]]}]#=>{"Foo"=>"#foo","Bar"=>"#bar"}拆分一点可以说更具可读性:h={}doc.xpath('//a[@href]').eachdo|link|h[link.t
我最近从C#转向了Ruby,我发现自己无法制作可折叠的标记代码区域。我只是想到做这种事情应该没问题:classExamplebegin#agroupofmethodsdefmethod1..enddefmethod2..endenddefmethod3..endend...但是这样做真的可以吗?method1和method2最终与method3是同一种东西吗?还是有一些我还没有见过的用于执行此操作的Ruby惯用语? 最佳答案 正如其他人所说,这不会改变方法定义。但是,如果要标记方法组,为什么不使用Ruby语义来标记它们呢?您可以使用