2012-09-06 43 views
6

對於某些關係表,我使用Python和SQLAlchemy。爲了存儲一些更大的數據結構,我使用Cassandra。我寧願只使用一種技術(cassandra)而不是兩種(cassandra和PostgreSQL)。關聯數據是否可以存儲在cassandra中?我可以在Cassandra CQL中使用SQLAlchemy嗎?

回答

13

不,Cassandra是一個NoSQL存儲系統,不支持像連接這樣的基本SQL語義,更不用說SQL查詢了。 SQLAlchemy專門用於SQL語句。 CQL只是類SQL,而不是實際的SQL本身。

the Cassandra CQL documentation引用:

雖然CQL有許多相似之處,SQL,也有一些根本性的分歧。例如,CQL適用於Cassandra數據模型和體系結構,因此仍不允許類似SQL的操作,例如對使用隨機分區的集羣上的行進行JOIN或範圍查詢。

你當然可以自由存儲在卡桑德拉所有你的數據,但是這意味着你必須重新思考如何存儲數據,並再次找到它。您不能使用SQLAlchemy將該數據映射到Python對象。

+0

但是沒有cassandra支持sql-like cql嗎? – AME

+0

@AME:與SQL本身不一樣。 :-)例如,沒有JOIN操作。 –

3

playOrm支持在noSQL上JOIN,因此您可以將關係數據放入noSQL,但它目前在java中。我們一直在考慮從服務器上爲您的程序公開S-SQL語言。 你會感興趣嗎?

的S-SQL是這樣的(如果你不使用的分區,你甚至不需要SELECT語句件事情之前)...

PARTITIONS T(:PARTID)選擇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兩次,第65行,因爲這是表返回時的樣子(當你使用任何類型的OO語言時,這種行爲很愚蠢)。

只是讓playOrm團隊知道,如果你需要的playOrm的GitHub網站上的任何內容。

院長

+0

即使它在Java中,是否可以與SQLAlchemy一起使用? – AME

+0

我們的想法是'最終'暴露一個JDBC接口,所以答案會是「是的,最終」。我們希望將S-SQL內置到我們的外部的所有noSQL存儲中。 –

+0

這就是我的問題,你會感興趣......我應該說ODBC,而不是JDBC(即最終我們想要爲所有語言公開一個跨語言連接)。 –

相關問題