我将Python与SQLAlchemy用于一些关系表。为了存储一些更大的数据结构,我使用Cassandra。我更喜欢使用一种技术(cassandra)而不是两种(cassandra和PostgreSQL)。是否可以将关系数据存储在cassandra中?
答案 0 :(得分:14)
不,Cassandra是一个NoSQL存储系统,不支持基本的SQL语义,如连接,更不用说SQL查询了。 SQLAlchemy专门用于SQL语句。 CQL只是类SQL,而不是实际的SQL本身。
引用the Cassandra CQL documentation:
虽然CQL与SQL有许多相似之处,但存在一些根本区别。例如,CQL适用于Cassandra数据模型和体系结构,因此在使用随机分区器的集群上的行上仍然不允许类似SQL的操作,如JOIN或范围查询。
您当然可以自由地将所有数据存储在Casandra中,但这意味着您必须重新考虑如何存储该数据并再次找到它。您不能使用SQLAlchemy将该数据映射到Python对象。
答案 1 :(得分:3)
如前所述,Cassandra不支持JOIN设计。改为使用Pycassa映射:http://pycassa.github.com/pycassa/api/pycassa/columnfamilymap.html
答案 2 :(得分:3)
playOrm支持noSQL上的JOIN,这样你就可以把关系数据放到noSQL中,但它目前在java中。我们一直在考虑从服务器中为您的程序公开S-SQL语言。 您会感兴趣吗?
S-SQL看起来像这样(如果不使用分区,在SELECT语句之前甚至不需要任何东西)......
PARTITIONS t(:partId)SELECT t FROM TABLE as t INNER JOIN t.security as s WHERE s.securityType =:type and t.numShares =:shares“)
这允许在noSQL环境中使用关系数据。如果您对数据进行分区,您可以使用快速查询和快速连接进行非常好的扩展。
如果您愿意,我们可以快速编写原型服务器的代码,该服务器公开您发送S-SQL请求的接口,我们会将某种形式的json返回给您。我们希望它与SQL结果集不同,当左连接和内部连接在图片中时,这是一个非常糟糕的主意。
即。我们会在这样的连接上返回结果(这样你就可以设置实际工作的最大结果)......
tableA行A - tableB row45 - tableB row65 - tableB第78行 tableA行C - tableB row46 - tableB row93
注意我们不返回多个行A,这样如果你有最大结果2,你得到行A和行C,就像在ODBC / JDBC中一样,你只能得到rowA两次,行45和行65,因为那是什么该表在返回时看起来像(当你使用任何类型的OO语言时,这是一种愚蠢的行为。)
让playOrm团队知道你是否需要playOrm github网站上的任何内容。
迪安