如何针对这种特定情况使用 Google App Engine Datastore 设计实体结构?
How to design entity structures using Google App Engine Datastore for this particular situation?
好的,这是我的需求。我想使用 Google App Engine 数据存储作为后端数据库构建一个网络应用程序。
该应用程序允许用户免费注册一个帐户。当每个注册用户都可以拥有一个储蓄账户时,他们可以在自己的储蓄账户中存取款。
使用本文中的信息 link https://cloud.google.com/appengine/docs/java/datastore/entities
我想到了这些代码
public class RegistrationServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
String email = request.getParameter("email");
String pass = request.getParameter("pass");
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
Entity user = new Entity("User");
user.setProperty("name",name);
user.setProperty("email",email);
user.setProperty("pass",pass);
datastore.put(user);
}
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
DatastoreService ds=DatastoreServiceFactory.getDatastoreService();
String email = request.getParameter("email");
String pass = request.getParameter("pass");
double credit=request.getParameter("credit");
double debit=request.getParameter("debit");
int userKeyInt=0;
Query q=new Query ("User");
PreparedQuery pq=ds.prepare(q);
for (Entity u1:pq.asIterable()){
String emailStr=u1.getProperty("Email").toString();
String userIDStr=u1.getProperty("UserID").toString();
String passStr=u1.getProperty("Pass").toString();
if(emailStr.equals(email) && passStr.equals(pass)) {
userKeyInt=Integer.parseInt(userIDStr);
}
}
Key userKey=KeyFactory.createKey("User", userKeyInt);
try{
Entity user = ds.get(key);
Entity savingAccount=new Entity ("SavingAccount");
savingAccount.setProperty("UserID", user.getKey());
savingAccount.setProperty("Debit",debit);
savingAccount.setProperty("Credit",credit);
}
catch (EntityNotFoundException e){
e.printStackTrace();
}
}
}
所以 Savingaccount 有字段 "UserID" 扮演外键的角色。
Entity user = new Entity("User");
Entity savingAccount=new Entity ("SavingAccount");
savingAccount.setProperty("UserID", user.getKey());
但我不确定我在做什么是对的,因为没有办法检查外键约束,我们是否需要建模实体关系,如本文所述linkhttps://cloud.google.com/appengine/articles/modeling?
如果我确实需要建模实体关系,那么该怎么做?
注意:每个用户可以有多个储蓄账户。
您可以使 SavingAccountEntity 成为 UserEntity 的子实体。它可能会变得有用,因为您可能决定更新事务中的实体以保持数据完整性。
使用这种方法,您可以通过对 SavingAccountEntity 进行简单的祖先查询来检索用户拥有的所有储蓄帐户。
好的,这是我的需求。我想使用 Google App Engine 数据存储作为后端数据库构建一个网络应用程序。
该应用程序允许用户免费注册一个帐户。当每个注册用户都可以拥有一个储蓄账户时,他们可以在自己的储蓄账户中存取款。
使用本文中的信息 link https://cloud.google.com/appengine/docs/java/datastore/entities
我想到了这些代码
public class RegistrationServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
String email = request.getParameter("email");
String pass = request.getParameter("pass");
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
Entity user = new Entity("User");
user.setProperty("name",name);
user.setProperty("email",email);
user.setProperty("pass",pass);
datastore.put(user);
}
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
DatastoreService ds=DatastoreServiceFactory.getDatastoreService();
String email = request.getParameter("email");
String pass = request.getParameter("pass");
double credit=request.getParameter("credit");
double debit=request.getParameter("debit");
int userKeyInt=0;
Query q=new Query ("User");
PreparedQuery pq=ds.prepare(q);
for (Entity u1:pq.asIterable()){
String emailStr=u1.getProperty("Email").toString();
String userIDStr=u1.getProperty("UserID").toString();
String passStr=u1.getProperty("Pass").toString();
if(emailStr.equals(email) && passStr.equals(pass)) {
userKeyInt=Integer.parseInt(userIDStr);
}
}
Key userKey=KeyFactory.createKey("User", userKeyInt);
try{
Entity user = ds.get(key);
Entity savingAccount=new Entity ("SavingAccount");
savingAccount.setProperty("UserID", user.getKey());
savingAccount.setProperty("Debit",debit);
savingAccount.setProperty("Credit",credit);
}
catch (EntityNotFoundException e){
e.printStackTrace();
}
}
}
所以 Savingaccount 有字段 "UserID" 扮演外键的角色。
Entity user = new Entity("User");
Entity savingAccount=new Entity ("SavingAccount");
savingAccount.setProperty("UserID", user.getKey());
但我不确定我在做什么是对的,因为没有办法检查外键约束,我们是否需要建模实体关系,如本文所述linkhttps://cloud.google.com/appengine/articles/modeling?
如果我确实需要建模实体关系,那么该怎么做?
注意:每个用户可以有多个储蓄账户。
您可以使 SavingAccountEntity 成为 UserEntity 的子实体。它可能会变得有用,因为您可能决定更新事务中的实体以保持数据完整性。
使用这种方法,您可以通过对 SavingAccountEntity 进行简单的祖先查询来检索用户拥有的所有储蓄帐户。