Cassandra数据建模的基本规则建议我们为每个查询模式创建表。
在实践中,这通常意味着每个人大约使用一个表 查询模式。如果您需要支持多种查询模式,那么您 通常需要不止一张桌子。
例如,我们可以为 Users
创建这3个表CREATE TABLE IF NOT EXISTS users(
id uuid,
username text,
emial text,
role text,
PRIMARY KEY (id)
);
CREATE TABLE IF NOT EXISTS users_by_role(
role text,
userid uuid,
username text,
emial text,
PRIMARY KEY (role)
);
CREATE TABLE IF NOT EXISTS users_by_email(
email text,
userid uuid,
username text,
role text,
PRIMARY KEY (email)
);
在使用Cassandra CSharp驱动程序的C#中,我们将 User 映射到第一个表:
public class User
{
public Guid Id;
public string UserName;
public string Email;
public string Role;
}
var config = new MappingConfiguration();
config.Define(new Map<User>()
.TableName("users")
.PartitionKey((o) => o.Id)
.Column((u) => u.Id, (cm) => cm.WithName("id"))
.Column((u) => u.UserName, (cm) => cm.WithName("username"))
.Column((u) => u.Email, (cm) => cm.WithName("email"))
.Column((u) => u.Role, (cm) => cm.WithName("role"))
.ExplicitColumns());
UserMapper = new Mapper(Session, config);
使用Mapper读取数据:
User result = UserMapper.Single<User>("WHERE id=?", guid);
我的第一个问题是:我们如何将用户映射到其他两个表 users_by_role 和 users_by_email ?我不认为我们必须再创建2个具有相同属性的CLR类型。 (此外,我们可以在其他表中使用不同的列) 第二个问题:我们如何在BatchStatement中使用定义的映射器?例如:要将用户插入第一个表,我们将使用:
UserMapper.Insert<User>(usr);
但在我们的示例中,我们必须批量插入3个表。什么是最好的方法?
驱动程序版本3.1.0.1
答案 0 :(得分:0)
我想这是无法做到的事情。 您将不得不继续将3映射到每个cassandra模型。
Cassandra Table&lt; =&gt; c#Object。
根据搜索类型(电子邮件,ID或角色)访问它们时,您需要创建一个抽象级别,这将返回用户。