Rethinkdb 数据库中的复合主键
我可以在数据库中创建复合主键吗?例如,如果我有一个带有下一个文档结构的表Rethinkdb 数据库中的复合主键,rethinkdb,Rethinkdb,我可以在数据库中创建复合主键吗?例如,如果我有一个带有下一个文档结构的表{authorsId:'371df80c-2efd-48f9-ac37-3edcdb152fb1',postsId:'905e0c92-adcb-4095-98df-fa08ca71b900'}如何在authorsId和postsId上同时创建主键。或者,如果我不能做到这一点,我应该如何在三个表中使用多对多关系。我是否使用一个字段作为主键,第二个字段作为辅助索引?主键只能位于一列上,但您可以将postsId和authorsI
{authorsId:'371df80c-2efd-48f9-ac37-3edcdb152fb1',postsId:'905e0c92-adcb-4095-98df-fa08ca71b900'}
如何在authorsId
和postsId
上同时创建主键。或者,如果我不能做到这一点,我应该如何在三个表中使用多对多关系。我是否使用一个字段作为主键,第二个字段作为辅助索引?主键只能位于一列上,但您可以将postsId
和authorsId
放入数组中,并将其用作主键值
有关更多信息,请参见此处:
编辑
主键仍然只是一个字段,但您可以使用[postsId,authorsId]作为该列的值并实现相同的效果。(从注释添加回答案)。重新思考DB主键用于单个列,您可以将其更改为任何字段,而不是默认的
id
。调用tableCreate
时,可以为primaryKey
传递一个字符串,以将该列用作主键
不能在多个列上创建主键。不过,您可以在多列上创建辅助索引。但是,RejectDB没有唯一的索引效果
如果要进行多对多关系,请使用3个表,您可以这样做:
表T1:id,字段
表T2:id,字段2
透视表p:t1\U id、t2\U id
然后您可以使用eqJoin
连接数据,或concatMap/getAll
。例如:
r.table("P").eq_join("t1_id", r.table("T1"))
.zip()
.eq_join("t2_id", r.table("T2"))
.zip()
基本上,从数据透视表开始,将数据与第一个表联接,然后继续与第二个表联接
您可以在这里阅读有关数据表联接的更多信息。当我将其放入数组时,出现异常:
预期的类型字符串,但找到了数组。
这里是查询r.db('Rbac')。tableCreate('Test',{primaryKey:['id1',id2']})
啊,让我重新表述我的答案,它让人困惑。主键仍然只是一个字段,但您可以使用[postsId,authorsId]
作为该列的值并实现相同的结果。@abilash:r.db('Rbac')。tableCreate('Test',{primaryKey:['id1',id2']}
给了我一个预期的类型字符串,但在DB 2.3.4中的
中找到了数组。我想答案是这样的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'])
。在data Explorer上测试感谢反馈,我还有一个答案-primaryKey在RejectionDB中不也是唯一的吗?对不起,我在上一篇评论中是“问题”而不是“答案”,我对下一个建议感到困惑-当我们创建透视表时,我们需要设置主键(t1\u id或t2\u id)但是主键是唯一的,并且pivot表中的存储值存在问题,这是否意味着我们需要第三列?主键是唯一的。在透视表上,它没有任何约束来保证[t1\u id,t2\u id]的唯一性。这些限制来自于数据库的分发,如1716版。因此,这取决于您的应用程序来处理。例如:当您将记录插入数据透视表时,可以使用额外的主id
字段和value=“${t1\u id}${t2\u id”来防止重复。所以,是的,我们必须在应用程序内部处理这个独特的问题。