3

iOSでキーバリューストアデータベースを作成する取り組みの一例は、YapDatabaseです。

しかし、私はそれを使った経験がないので、CoreDataやFMDBのようなものの代わりにこれを使用する価値があるかどうかを理解したいと思います。

私が持っている重要な質問の1つは、このデータベースとのオブジェクトの関係をどのように管理するかということです。

オブジェクトの関係を回避できる場合は、別のオブジェクトと多対多の関係を持つオブジェクトの問題を解決する方法についての提案またはデータベース設計のヒントを探しています。

1つのユースケースを考えてみましょう(これは単なる例であり、この問題の解決に役立ちます)。

sender <<->> message <<->> recipient

sender has a: 
    photo_data, 
    name, 
    gender, 
    age, 
    email, 
    username, 
    twitter_id, 
    facebook_id, 
    sender_id

recipient has a: 
    photo_data, 
    name, 
    gender, 
    age, 
    email, 
    username, 
    twitter_id, 
    facebook_id, 
    recipient_id

message has a:
    text, 
    rich_text, 
    picture_data, 
    voice_data, 
    shared_url, 
    message_id

message_id、sender_id、recipient_idを使用して各モデルを関連付けることを考えましたが、より良い方法はありますか?

4

1 に答える 1

6

私はこのようなことをしました。これは正確には合わないかもしれませんが、役立つかもしれません。

チャットアプリケーションについても同様の設定がありました。すべてのメッセージには送信者と受信者がいましたが、明らかに現在のユーザーは2人のうちの1人でした。そのため、すべてのメッセージを独自のコレクションに保存しました。コレクションの名前は、非現在のユーザーのIDでした。

YapDatabaseを使用する場合は、YapCollectionsDatabaseクラスを使用します。

==編集==

メッセージとユーザークラスを作成することから始めます。

@interface Message : NSObject <NSCoding> ...

@property (...) NSString *sender_id;
@property (...) NSString *recipient_id;
@property (...) NSString *user_id; // sender_id || recipient_id (non-current-user)

@property (...) NSDate *timestamp;
...
@end

@interface User : NSObject <NSCoding>

@property (...) NSString *user_id;
...
@end

次に、これらのオブジェクトをデータベースに保存します。

YapCollectionsDatabaseから始めます。これはコレクション/キー/値ストアです。したがって、新しいメッセージが到着すると、それを適切なコレクションに保存するだけです。

[dbConnection readWriteWithBlock:^(YapCollectionsDatabaseReadWriteTransaction *transaction){
    [transaction setObject:messsage
                    forKey:uuid
              inCollection:message.user_id
              withMetadata:message.timestamp];
}];

したがって、各メッセージは個別に保存されます。ただし、会話内の他のすべてのメッセージとともにコレクションに配置されます。さらに、データベースに1つの行を追加するだけなので、新しいメッセージの追加は高速です。

内部的には、sqliteデータベースは次のようになります。|コレクション|キー|オブジェクト|メタデータ|

会話の数を見つける、または会話のuserIdを取得するには:

[dbConnection readWithBlock:^(YapCollectionsDatabaseReadTransaction *transaction){
    conversationCount = [transaction numberOfCollections];
    conversationUserIds = [transaction allCollections];
}];

会話内のメッセージの数、またはメッセージのIDを取得するには:

[dbConnection readWithBlock:^(YapCollectionsDatabaseReadTransaction *transaction){
    messageCount = [transaction numberOfKeysInCollection:user_id];
    messageIdsSorted = [transaction allKeysOrdered:NSOrderedAscending
                                      inCollection:user_id];
}];

データベースから古いメッセージを削除するには:

[dbConnection readWriteWithBlock:^(YapCollectionsDatabaseReadWriteTransaction *transaction){
    [transaction removeObjectsEarlierThan:twoWeeksAgo inCollection:user_id];
}];

お役に立てれば。

于 2013-03-27T03:32:44.170 に答える