【发布时间】:2020-03-18 15:08:35
【问题描述】:
我已经搜索过,但没有得到任何具体答案。我使用 Cassandra 作为我的数据库,并且我有三个具有相同属性的表。如何同时保存、更新和删除这三个表中的相同数据。
用户表
Create Table user (
userid bigint,
username text,
password text,
name text,
email text,
phone text,
birthday text,
biography text,
PRIMARY KEY (userid)
)
user_username 表
Create Table user (
username text,
userid bigint,
password text,
name text,
email text,
phone text,
birthday text,
biography text,
PRIMARY KEY (username)
)
user_email 表
Create Table user (
email text,
username text,
userid bigint,
password text,
name text,
phone text,
birthday text,
biography text,
PRIMARY KEY (email)
)
这些是存储库
public interface UserRepository extends ReactiveCassandraRepository<User, Long> {
}
public interface UserUsernameRepository extends ReactiveCassandraRepository<UserUsername, String> {
}
public interface UserEmailRepository extends ReactiveCassandraRepository<UserEmail, String> {
}
我可以单独保存它们,但不能同时保存
public Mono<ServerResponse> createUser(ServerRequest request) {
Mono<User> user = request.bodyToMono(User.class);
return ServerResponse.ok().build(userRepository.saveUser(user));
}
注册 POJO(JSON 有效负载)
public class SignUp {
private String name;
private String username;
private String email;
private String password;
}
public Mono<ServerResponse> post(ServerRequest request) {
Mono<SignUp> signUp = request.bodyToMono(SignUp.class);
final UUID id = UUID.randomUUID();
return created(UriComponentsBuilder.fromPath("user/" + id).build().toUri())
.contentType(APPLICATION_JSON)
.body(
fromPublisher(
signUp.map(u -> new User(u, id)).flatMap(userManager::saveUser), User.class)
signUp.map(u -> new UserUsername(u, id)).flatMap(userManager::saveUsername), User.class)
signUp.map(u -> new UserEmail(u, id)).flatMap(userManager::saveEmail), User.class)
);
}
I need help to resolve this issues. The same thing goes to delete and update
public Mono<ServerResponse> delete(ServerRequest request) {
String id = request.pathVariable("id");
return personManager
.findById(id)
.flatMap(u -> noContent().build(userManager.deleteUser(u)))
// User is deleted
// How to delete UserUsername
// also delete UserEmail
}
【问题讨论】:
-
为什么要复制数据库中的数据?
-
像 Cassandra 这样的分布式数据库需要数据复制。现在磁盘便宜了。为了改进 Cassandra 读取,我们需要复制数据,以便在发生某些故障时确保数据的可用性。
标签: java reactive-programming spring-webflux spring-data-cassandra