1

ソーシャルフィード(ニュースフィード)を作成するタスクがあります。標準機能については説明不要かと思いますが、どれも FB のようです。私はソリューションapache cassandraを選択し、投稿ユーザーに関する情報を保存するためのデータ列Postsを設計しました。

CREATE TABLE Posts (
  post_id  uuid,
  post_at  timestamp,
  user_id  text,
  name     varchar,
  category set<text>,
  link     varchar,
  image    set<varchar>,
  video    set<varchar>,
  content  map<text, text>,
  private  boolean,

  PRIMARY KEY ((post_id, user_id), post_at)
)
WITH CLUSTERING ORDER BY (post_at DESC) COMPACT STORAGE;

次の表には、id ユーザーの投稿が含まれています。

CREATE TABLE posts_user (
  post_id  bigint,
  post_at  timestamp,
  user_id  bigint,
  PRIMARY KEY ((post_id), post_at, user_id)
)

WITH CLUSTERING ORDER BY (post_at DESC) AND COMPACT STORAGE;

どうですか、いいですか?そのようなデータモデルで何を変更しますか?

4

1 に答える 1

1

飛び出すいくつかの質問といくつかの改善があります。

  1. COMPACT STORAGE は非推奨になりました (CQL 3 機能を利用したい場合)。PostsCOMPACT STORAGEでCQL 3機能(コレクション)を使用し、主キーの一部ではない複数の列を宣言しているため、上記で定義したようにテーブルを作成できるとは思いません。

  2. posts_userとはまったく異なるキータイプがPostsあります。2 つのテーブルの関係がどのようなものかは明確ではありませんが、一方のテーブルに a があり、もう一方のテーブルにpost_ida があるのに対し、それらの間で一貫性があるはずだと思います。他の分野との相違点もあります。uuidbigint

  3. が一意であり、個々の投稿の ID を表していると仮定すると、それをテーブルpost_idの複合主キーの最初の部分として使用するのは奇妙です。さらに、これはパーティション キーの一部であるため、複数の投稿をより幅広く選択したり、順序を利用したりすることもできなくなります。Postspost_idpost_at

これを修正する一般的な方法は、専用のインデックス テーブルを作成して、必要な方法でデータを並べ替えることです。

例えば

CREATE TABLE posts (
  id       uuid,
  created  timestamp,
  user_id  uuid,
  name     text,
  ...
  PRIMARY KEY (id)
);

CREATE TABLE posts_by_user_index (
  user_id    uuid,
  post_id    uuid,
  post_at    timestamp,
  PRIMARY KEY (user_id,post_at,post_id)
  WITH CLUSTERING ORDER BY (post_at DESC)
);

またはより包括的に:

CREATE TABLE posts_by_user_sort_index (
  user_id    uuid,
  post_id    uuid,
  sort_field text,
  sort_value text,
  PRIMARY KEY ((user_id,sort_field),sort_value,post_id)
);

ただし、データを一方向にのみ選択したい場合は、postsテーブルを使用して並べ替えを行うことができます。

CREATE TABLE posts (
  id       uuid,
  post_at  timestamp,
  user_id  uuid,
  name     text,
  ...
  PRIMARY KEY (user_id,post_at,id)
  WITH CLUSTERING ORDER BY (post_at DESC)
);

後で追加のインデックスを追加したい場合は、投稿 ID だけでなく、user フィールドと post_at フィールドによっても各投稿にインデックスを付ける必要があるため、複雑になります。

于 2014-08-26T23:26:28.363 に答える