我打算在這方面使用MySQL,但Google Datastore看起來可能是一個可能的解決方案,我不必擔心管理服務器,這是一個很大的優勢。我需要存儲一件東西,消息。我打算有一個MySQL消息傳遞表,其中將包含來自用戶的消息給其他用戶。Google Datastore
我希望我可以將我的MySQL消息表有效地翻譯成Google數據存儲。我的要求是,使用MySQL的解決方案是:
消息只能由一個用戶發送給另一個用戶。第一次閱讀時需要更新這條消息,說明它已經被閱讀,所以如果已經閱讀,它將需要一次更新。用戶必須能夠查看其最新訂購的所有發送消息,以及最新訂購的所有消息。
我最初的設計是這樣的:
信息表:
Message_ID (BIGINT) PK auto_increment
FromUser (INT 16)
ToUser (INT 16)
DateCreated (Timestamp)
MessageText (Varchar (500))
HasRead (TINYINT (0=false, 1=true))
將要運行的查詢將包括:
SELECT * FROM messages WHERE FromUser = '10000000' ORDER BY DateCreared DESC LIMIT [starting pagination value], 10 ; //get all users sent messages - newest first, get 10 at a time
SELECT * FROM messages WHERE ToUser= '10000000' ORDER BY DateCreared DESC LIMIT [starting pagination value], 10 ; //get all user's received messages - newest first, get 10 at a time
UPDATE messages SET HasRead = 1 WHERE Message_ID = '123456789'; // When a message has been read update it to show it has been read.
因此,我將有以下指標:
-Message_ID(主索引) - (FromUser,DateCreated)BTREE DESC - (ToUser,DateCreated)BTREE DESC 額外的「想要有特性,但是如果它能夠影響性能或者實現起來太複雜,他們與其他用戶的消息:
SELECT * FROM messages WHERE (FromUser = '1000000 and ToUser = '2000000') OR (FromUser = '2000000' and ToUser = '1000000') ORDER BY DateCreated DESC [starting pagination value], 10 ; // Get all the messages sent between user 1000000 and user 2000000 - newest first, fetch 10 at a time. I was thinking of creating a new column which would be be a concatenation of [smaller_userid]-[larger_userid] and search on this field instead. If this was the case I would have an additional composite index on this new column + DateCreated. SELECT * FROM messages WHERE concateduser = '1000000-2000000' ORDER BY DateCreated DESC [starting pagination value], 10 ;
我們相信這會爲工作,但我們目前有用戶的一個活躍的社區,並估計當我們推出將頻繁使用的功能。因此,我們也希望能夠規劃未來的規模(現在還不成熟,但我們認爲這是一個非常簡單的功能,並且希望現在設計好,以節省我們未來的時間)。
所以這就是我打算用MySQL做的事情。這可以轉換成Google Datastore,它會有效嗎?
我研究了一些解決方案,但它們會相當昂貴。我的第一個想法是讓每個消息成爲一個實體。這個實體會在To,From,hash(user1 + user2)屬性上有一個索引。這將允許我獲取用戶消息,以及用戶消息的組合。問題是寫入會很昂貴,如果讀取的消息會更新,則更新會很昂貴。查詢也很昂貴,如果我最初加載10條消息,它將花費1 + 10個讀取單位。我嘗試了另一種在一個實體中存儲N個消息的解決方案。對於每個用戶,我需要存儲他們當前處於哪個實體的費用,因爲對於每條消息,我需要兩次寫入相同的數據(每個用戶一次),兩組都需要更新,另外還有額外的讀取以獲取用戶在插入或閱讀消息時所處的當前實體。我正在尋找這個簡單要求的更好的解決方案。