Cassandra上的大多数文章都关注硬件优势
然而,在我们的办公室,我们正在考虑从PostgreSQL迁移到Cassandra,原因很简单,在Cassandra中,人们可以将所有东西都放在桌子上,就像狂野的西部一样。
因此,我们办公室的一般方法目前是这样的
CREATE TABLE IF NOT EXISTS Person (
id SERIAL PRIMARY KEY,
fname VARCHAR(256)
);
CREATE TABLE IF NOT EXISTS Job (
id SERIAL PRIMARY KEY,
employeeId INT REFERENCES (Person)
);
CREATE TABLE IF NOT EXISTS Car (
id SERIAL PRIMARY KEY,
ownerId INT REFERENCES (Person),
year INT
);
CREATE TABLE IF NOT EXISTS Insurance (
id SERIAL PRIMARY KEY,
carId INT REFERENCES (Car)
);
但是我们正在考虑向Cassandra迈进以实现类似下面的内容
CREATE TABLE IF NOT EXISTS Lazy (
id SERIAL PRIMARY KEY,
fname VARCHAR(256),
employeeId INT REFERENCES (Person)
ownerId INT REFERENCES (Person),
year INT
carId INT REFERENCES (Car)
);
我体内的每一条编程光纤都告诉我这是错的,但是将我们的前端从面向对象的层次结构转换为Postgres的关系模型是噩梦,因为我们有大量的嵌套外键。
这是应该如何使用Cassandra吗?
答案 0 :(得分:2)
这完全取决于您的数据访问模式。
考虑您的示例(删除不支持的功能):
CREATE TABLE IF NOT EXISTS Lazy (
id INT PRIMARY KEY,
fname VARCHAR(256),
employeeId INT,
ownerId INT,
year INT,
carId INT,
);
您只能才能按ID搜索。您提供了id,您可以获得任何字段fname,employeeId,ownerId,year,carId。您无法使用任何其他ID字段进行查询。
您可以通过将它们添加为群集列来搜索这些内容,如下所示:
CREATE TABLE IF NOT EXISTS Lazy (
id INT,
fname VARCHAR(256),
employeeId INT,
ownerId INT,
year INT,
carId INT,
PRIMARY KEY((id), employeeId, ownerId, carId)
);
现在,您可以搜索字段 employeeId , ownerId 和 carId ...但仅当您还提供分区时key id 。主键定义中的排序也很重要。要按其中一个聚类列进行搜索,您必须提供所有前面的列。即如果你想通过carId搜索,你还必须提供employeeId和ownerId(以及id)。
我怀疑这是你真正想要的。我建议用Cassandra对数据建模进行一些研究,看看Cassandra的优化内容。您可能最终会想要几个表,例如:
Persons_by_id
Persons_by_car
Persons_by_job
Cars_by_job
等
答案 1 :(得分:0)
Cassandra数据模型将根据查询。意味着你想从cassandra输出什么。不要像关系模型那样思考。 cassandra数据库是no-sql所以你可以将一种类型的数据写入更多的表。因为cassandra没有联接,这就是为什么你必须根据你的查询将所有数据放在一个表中。