【问题标题】:Compound primary key in RethinkDBRethinkDB 中的复合主键
【发布时间】:2015-11-07 17:29:21
【问题描述】:

我可以在 RethinkDB 中创建复合主键吗?例如,如果我有一个带有下一个文档结构{authorsId: '371df80c-2efd-48f9-ac37-3edcdb152fb1', postsId: '905e0c92-adcb-4095-98df-fa08ca71b900'} 的表,我如何在authorsIdpostsId 上同时创建主键。或者如果我不能做到这一点,我应该如何以三张表的方式使用多对多关系。我是否使用一个字段作为主键,第二个作为二级索引?

【问题讨论】:

    标签: rethinkdb


    【解决方案1】:

    主键只能位于一列,但您可以将 postsIdauthorsId 放入一个数组中,并将其用作主键值。

    请参阅此处了解更多信息: https://www.rethinkdb.com/api/javascript/table_create/

    编辑

    主键仍然只是一个字段,但您可以使用 [postsId, authorsId] 作为该列的值并实现相同的效果。 (从评论添加回答案)。

    【讨论】:

    • 当我把它放入数组时出现异常:Expected type STRING but found ARRAY
    • 这里是查询r.db('Rbac').tableCreate('Test', {primaryKey: ['id1', 'id2']})
    • 啊,让我改写我的答案,这很混乱。主键仍然只是一个字段,但您可以使用 [postsId, authorsId] 作为该列的值并实现相同的效果。
    • @abilash: r.db('Rbac').tableCreate('Test', {primaryKey: ['id1', 'id2']}) 在 RethinkDB 2.3.4 中给了我一个 Expected type STRING but found ARRAY in
    • 我认为答案是这样的。 r.db('test').tableCreate('mytable', {primaryKey: 'myprimary'}),然后当您读取、插入或更新 r.db('test').table('mytable').insert({myprimary: ['id1value', 'id2value'], othervalue: 'something'})r.db('test').table('mytable').update({myprimary: ['id1value', 'id2value'], othervalue: 'newthing'})r.db('test').table('mytable').get(['id1value', 'id2value'])。在数据浏览器上测试
    【解决方案2】:

    RethinkDB 主键是针对单个列的,你可以将其更改为任何字段而不是默认的id。当您调用tableCreate 时,您可以为primaryKey 传递一个字符串以将该列用作主键。

    您不能在多个列上创建主键。不过,您可以在多列上创建二级索引。但是,RethinkDB 没有唯一索引效果https://github.com/rethinkdb/rethinkdb/issues/1716

    如果你想做多对多的关系,使用3个表,你可以这样做:

    表 T1:id、字段

    表 T2:id、字段 2

    数据透视表 P:t1_id, t2_id

    然后你可以使用eqJoin加入数据,或者concatMap/getAll。示例:

    r.table("P").eq_join("t1_id", r.table("T1"))
      .zip()
      .eq_join("t2_id", r.table("T2"))
      .zip()
    

    基本上从数据透视表中,您将数据与第一个表联接,然后继续与第二个表联接。

    您可以在此处阅读有关数据表连接https://www.rethinkdb.com/docs/table-joins/#many-to-many-relations 的更多信息。

    【讨论】:

    • 感谢您的反馈,我还有一个答案 - 在 RethinkDB 中,primaryKey 也不是唯一的吗?
    • 抱歉,我的意思是“问题”而不是“回答”在上一条评论中
    • 我对下一个建议感到困惑 - 当我们创建数据透视表时,我们需要设置主键(t1_id 或 t2_id),但主键是唯一的,并且在数据透视表中存储值存在问题跨度>
    • 这是否意味着我们需要第三列?
    • 主键是唯一的。在数据透视表上,它没有任何约束来保证 [t1_id, t2_id] 的唯一性。这些限制来自于数据库的分布,如 issue 1716 github.com/rethinkdb/rethinkdb/issues/1716。因此,由您的应用程序来处理这个问题。例如:当您将记录插入数据透视表时,您可以使用额外的主 id 字段,其值 = "${t1_id}${t2_id" 以防止重复。所以是的,我们必须在我们的应用程序中处理这个独特的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 2015-04-27
    • 2013-06-07
    • 2013-10-23
    • 2020-03-28
    • 1970-01-01
    相关资源
    最近更新 更多