私はこの問題を抱えています:
- ユーザーはキャンディーをたくさん持っています ( 1:M )。
- キャンディーの 1 つにプライマリフラグを設定できます
- ユーザーごとに 1 つのキャンディーのみをプライマリにすることができます
プライマリフラグを実行するためのより良い解決策はどれですか?
ソリューション1:
ユーザー
| id | name |
| 1 | Joe |
キャンディーズ
| id | user_id | primary |
| 1 | 1 | true |
| 2 | 2 | false |
ソリューション 2:
ユーザー
| id | name | primary_candy_id |
| 1 | Joe | 2 |
キャンディーズ
| id | user_id |
| 1 | 1 |
| 2 | 2 |
ソリューション 1 のメモ
- キャンディーテーブルのキャンディーに関連するすべてのものを手に入れました
- キャンディーがプライマリかどうかを確認すると、クエリが高速になります(参加する必要はありません)
- ユーザーが 100 個のキャンディーを取得した場合、この方法で 99 個が偽になり、意味のある真が 1 個だけになります=> 99 個の不要な列レコード
解決策 2 のメモ
- このようにして、列レコードが 1 つだけになります (他に 99 を節約できます)。
- Candy がプライマリかどうかを確認したい場合は、クライアント テーブルに参加する必要があります
- ユーザーに関連するプライマリ フラグを持つ 1:M テーブルをさらに導入するとします: アイスクリーム、チョコレート、ジャンクフード... このようにして、ユーザーにさらに 4 つの列ができます。
これはよりSQLの問題ですが、プロジェクトでRails 3.*を使用しているため、この分野のベストプラクティスの意見を歓迎します