我将 Python 与 SQLAlchemy 一起用于一些关系表。为了存储一些较大的数据结构,我使用 Cassandra。我宁愿只使用一种技术(cassandra)而不是两种(cassandra 和 PostgreSQL)。是否也可以将关系数据存储在 cassandra 中?
3 回答
不,Cassandra 是一个NoSQL存储系统,不支持连接等基本 SQL 语义,更不用说 SQL 查询了。SQLAlchemy 专门用于 SQL 语句。CQL 只是类似于 SQL,而不是实际的 SQL 本身。
尽管 CQL 与 SQL 有许多相似之处,但也有一些根本的区别。例如,CQL 适用于 Cassandra 数据模型和架构,因此仍然不允许类似 SQL 的操作,例如 JOIN 或对使用随机分区器的集群上的行进行范围查询。
您当然可以自由地将所有数据存储在 Casandra 中,但这意味着您必须重新考虑如何存储这些数据并再次找到它。您不能使用 SQLAlchemy 将该数据映射到 Python 对象中。
如前所述,Cassandra 在设计上不支持 JOIN。改用 Pycassa 映射:http: //pycassa.github.com/pycassa/api/pycassa/columnfamilymap.html
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 结果集,当左连接和内连接出现在图片中时,这是一个非常糟糕的主意。
IE。我们会像这样在连接上返回结果(这样你就可以设置一个实际有效的最大结果)......
表A行A-表B行45-表B行65-表B行78表A行C-表B行46-表B行93
注意,我们不会返回多个 A 行,因此如果您有最大结果 2,您将获得 A 行和 C 行,而在 ODBC/JDBC 中,您将仅获得 rowA 两次,其中第 45 行和第 65 行,因为这就是表格的外观就像它被返回时一样(当您使用任何类型的 OO 语言时,这有点愚蠢)。
只需让 playOrm 团队知道您是否需要 playOrm github 网站上的任何内容。
院长