user_id と user_widget_id を主キーとする user_widgets のテーブルを作成したいと思います。ここで、user_widget_id はシリアルのように機能しますが、ユーザーごとに 1 から始まる点が異なります。
これに対する一般的または実用的な解決策はありますか? 私は PostgreSQL を使用していますが、不可知論的な解決策も歓迎します。
テーブルの例: user_widgets
| user_id | user_widget_id | user_widget_name |
+-----------+------------------+----------------------+
| 1 | 1 | Andy's first widget |
+-----------+------------------+----------------------+
| 1 | 2 | Andy's second widget |
+-----------+------------------+----------------------+
| 1 | 3 | Andy's third widget |
+-----------+------------------+----------------------+
| 2 | 1 | Jake's first widget |
+-----------+------------------+----------------------+
| 2 | 2 | Jake's second widget |
+-----------+------------------+----------------------+
| 2 | 3 | Jake's third widget |
+-----------+------------------+----------------------+
| 3 | 1 | Fred's first widget |
+-----------+------------------+----------------------+
編集:
このデザインのいくつかの理由を含めたかっただけです。
1.「隠蔽によるセキュリティ」だけでなく、情報漏えいを減らす
ユーザーがお互いを認識してはならないシステムでは、お互いの widget_id も認識してはなりません。これが在庫の表、奇妙な企業秘密、請求書、またはより機密性の高いものである場合、それらのウィジェットに対して影響のない独自の ID のセットを開始できます。明らかな定期的なセキュリティ チェックに加えて、これにより暗黙的なセキュリティ レイヤーが追加され、ウィジェット IDとユーザー ID の両方でテーブルをフィルター処理する必要があります。
2. データのインポート
ユーザーは、レガシー ID (整数 ID を持っている場合) をすべて破棄することなく、他のシステムからデータをインポートできるようにする必要があります。
3. 清潔さ
私の最初のポイントとそれほど違いはありませんが、他のユーザーよりも少ないコンテンツを作成するユーザーは、ウィジェット ID の大幅なジャンプに困惑したりイライラしたりする可能性があると思います。もちろん、これは機能的というよりは表面的なものですが、それでも価値がある可能性があります。
可能な解決策
答えの 1 つは、アプリケーション層がこれを処理することを示唆しています。インクリメントされるユーザーのテーブルに next_id 列を格納できます。または、ユーザーごとに行数を数えて、レコードの削除を許可しないこともできます (代わりに削除済み/非アクティブ化フラグを使用)。これは、アプリケーション層ではなく、トリガー関数またはストアド プロシージャを使用して実行できますか?