現在、アイテムのスコア表を作成しています。
各項目にはスコアがあるため、データベース (postgres) は項目をスコアでソートしてユーザーに返すことができます。
現在、製品の合計スコアは次の式で決定されます。
- 鮮度スコア(プロセスAで計算)
- 人気スコア(プロセスBで計算)
- 関連性スコア (プロセス C で計算)
合計 = 0.5 * 鮮度 + 0.25 * 人気 + 0.25 * 関連性
プロセス A、B、C は数時間にわたって実行され、(item_id、スコア、タイプ) が生成されます。ここで、タイプは「新鮮」、「人気」、または「関連性」のいずれかです。
これらの値は異なるプロセスによって生成されるため、これらの値を保持する必要があることに注意してください。
実行できるようにするために何をする必要がありますかSELECT * FROM items JOIN scores ON items.id == scores.item_id ORDER BY <total_score ??> DESC LIMIT 10 OFFSET 0;
編集
明白な答えはtype = total
、すべてのアイテムに対して別のプロセスを生成させることです。これは機能しますが、これらのスコアのいずれかが変更されるたびに合計を更新する必要があるため、面倒です。さらに、データ ストレージを 25% から 100% に増やすことができます。これを組み込むにはかなりの手間がかかるため、これを最適なソリューションとは考えていません。
アップデート
これは私のスコア表です:
Column | Type | Modifiers | Storage | Description
---------------+-----------------------------+-----------------------------------------------------------+----------+-------------
created_at | timestamp without time zone | | plain |
updated_at | timestamp without time zone | | plain |
id | integer | not null default | plain |
score | double precision | not null | plain |
type | character varying | not null | extended |