我明白你在问什么。不,您应该能够将所有列构建到一个表中。假设我创建了一个像这样的users 表:
CREATE TABLE users(
userid bigint,
username text,
email text,
dob text,
loc text,
mobile text,
landlinenum text,
PRIMARY KEY (userid));
然后我插入一些这样的行:
INSERT INTO users (userid,username,email,loc,mobile) VALUES (0,'mreynolds','mal@serenity.com','Minneapolis','111-555-1234');
INSERT INTO users (userid,username,email,loc,landlinenum,dob) VALUES (1,'jcobb','jayne@serenity.com','Minneapolis','111-555-3464','19620227');
INSERT INTO users (userid,username,email,loc,mobile) VALUES (2,'dbook','derrial@serenity.com','New York','111-555-2349');
INSERT INTO users (userid,username,email,loc,mobile,dob) VALUES (3,'stam','simon@serenity.com','San Francisco','111-555-8899','19750416');
INSERT INTO users (userid,username,email,loc,dob) VALUES (4,'rtam','river@serenity.com','San Francisco','19810724');
如果我运行一个未绑定的查询来拉回所有行和列,我会看到:
aploetz@cqlsh:stackoverflow> SELECT * FROM users;
userid | dob | email | landlinenum | loc | mobile | username
--------+----------+----------------------+--------------+---------------+--------------+-----------
2 | null | derrial@serenity.com | null | New York | 111-555-2349 | dbook
3 | 19750416 | simon@serenity.com | null | San Francisco | 111-555-8899 | stam
4 | 19810724 | river@serenity.com | null | San Francisco | null | rtam
0 | null | mal@serenity.com | null | Minneapolis | 111-555-1234 | mreynolds
1 | 19620227 | jayne@serenity.com | 111-555-3464 | Minneapolis | null | jcobb
(5 rows)
所以这应该告诉你一些事情。
Cassandra 并不像在 CQL 之前的世界中那样真正“无模式”。您必须在表定义中定义每一列。
说到 #1,您不必必须为每一列提供一个值。
未被赋值的列显示为“null”。请记住,它们不是真正的空值,它们只是以这种方式显示。
在我的 INSERT 中,我只指定了具有相应值的列。我没有将其他设置为空或空。将列值显式设置为 null 会创建一个墓碑。
现在我要了解您的查询要求,您通常希望为所需的每个查询创建一个表。我有由userid 键入的“用户”表...但实际上,这有多大用处?应用程序通常通过email 或loc 之类的方式进行查询。
为了处理电子邮件,我将创建一个具有相同列定义的新表,称为“users_by_email”。主要区别(除了名称)将是 PRIMARY KEY 定义:PRIMARY KEY (email,username)
然后我可以像这样通过电子邮件查询用户:
aploetz@cqlsh:stackoverflow> SELECT * FROM users_by_email WHERE email='river@serenity.com';
email | username | dob | landlinenum | loc | mobile | userid
--------------------+----------+----------+-------------+---------------+--------+--------
river@serenity.com | rtam | 19810724 | null | San Francisco | null | 4
(1 rows)
这就是为什么了解您的查询模式会有所作为。在第一个示例中,“users”表不支持email 的查询。