down votefavorite 
<http://stackoverflow.com/questions/36585664/model-datastore-application#>

I am looking how to create an efficient model which will satisfy the 
requirements I put below. I have tried using gcloud-node but have noticed 
it has limitations with read consistencies, references, etc. I would prefer 
to write this is nodejs, but would be open to writing in java or python as 
long as it would improve my model. I am building around the new pricing 
model which will come July 1st.

My application consists of a closed email system. In essence what happens 
is users register to the site. These user's can make friends. Then they can 
send emails to each other.

*Components of the app:*

Users - Unlimited amount of users can join.

Friends - A User can have 200 confirmed friends and 100 pending friend 
requests. When a friendlist is retrieved it should show the name of the 
friend. (I will also need to receive the id of the friends so I can use it 
on my client side to create emails).

Emails - Users can send emails to their friends and they can receive emails 
from their friends. The user can then view all their sent emails 
independently(sentbox) and all their received emails independently(inbox). 
They can also view the the emails sent between themselves and a friend 
order by newest. The emails should show the senders and receivers names. 
Once an email is read it needs to be marked as read.

My model looks something like this, but as you can see their are 
inefficiencies.

*Datastore Kinds:*

USER
-email (id) //The email doesn't need to be the id, but I need to be able to 
retrieve users by their email
-hash_password
-name
-account_status
-created_date

FRIEND
-id (auto-generated)
-friend1
-friend2
-status

EMAIL
-id (auto-generated)
-from
-to
-mutual_id
-message
-created_date
-has_seen

*Procedures of the application:*

*Register* - Get operation to see if a user with this email exists. If does 
not insert key.

*Login* - Get operation to get user based on email. If exists retrieve the 
hash_password from the entity and compare to user's input.

*Send friend request* - Friend data will be written twice for every 
relationship. Then using the index on friend1 and index on status I will 
query all the friends for a user and filter only those which are 'pending'. 
I will then count these friends and see if they are over X. Again I will do 
this for the other user. If they are both not over the pending limit, I 
will insert the friend request. This needs to run in a transaction.

*Accept a friend request* - Friend data will be written twice for every 
relationship. Then using the index on friend1 and index on status I will 
query all the friends for a user and filter only those which are pending. I 
will then count these friends and see if they are over X. Again I will do 
this for the other user. If they are both not over the pending limit, I 
will change both entities's status to accepted as a transaction.

*Show confirmed friends* - Friend data will be written twice for every 
relationship. Then using the index on friend1 and index on status I will 
query all the friends for a user and filter only those which are accepted. 
Not sure how I will show the friend's names (e.g what happens if a user 
changed their name this needs to be reflected in all friend relationships 
and emails!).

*Show pending friends* - Friend data will be written twice for every 
relationship. Then using the index on friend1 and index on status I will 
query all the friends for a user and filter only those which are pending. 
Not sure how I will show the friend's names (e.g what happens if a user 
changed their name this needs to be reflected in all friend relationships 
and emails!).

*View sent emails* - Using the index on the from property I would query to 
get all the sent emails from a user 5 at a time ordered by created_date 
(newest first). (e.g what happens if a user changed their name this needs 
to be reflected in all friend relationships and emails!).

*View received emails* - Using the index on the to property I would query 
to get all the received emails to a user 5 at a time ordered by 
created_date (newest first). When a emails is seen it will update that 
entities has_seen property to true. (e.g what happens if a user changed 
their name this needs to be reflected in all friend relationships and 
emails!).

*View emails between 2 users* - Using the index on mutual_id which is based 
on [lower_lexicographic_email]:[higher_lexicographic_email] to query the 
mutual emails. Ordered by newest, 5 at a time. (e.g what happens if a user 
changed their name this needs to be reflected in all friend relationships 
and emails!).

*Create email* - Using the friend1 and status index I will confirm the 
user's are friends. If they are friends, I will insert an email.

-- 
You received this message because you are subscribed to the Google Groups 
"Google App Engine" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/google-appengine.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/google-appengine/81b915d7-4751-4c21-8ae1-f94bc482a024%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to