好奇心から質問しています。基本的に私の質問は、フラグのように動作する行エントリを必要とするデータベースがある場合、ベスト プラクティスは何ですか? 良い例としては、Stack Overflow のバッジや Bugzilla のオペレーティング システム フィールドが挙げられます。特定のエントリに対して、フラグの任意のサブセットを設定できます。
通常、私は C と C++ の仕事をしているので、直感的には、符号なし整数フィールドを反転可能なビットのセットとして使用することになります... しかし、いくつかの理由から、それが良い解決策ではないことはわかっています。 最も明白な理由はスケーラビリティです。フラグの数には厳しい上限があります。
他にも、スケーラビリティは向上するが、すべての情報を取得するために複数の選択が必要になるため、パフォーマンスの問題が発生するソリューションがいくつか考えられます。
では、これを「正しく」行う方法は何でしょうか?
ベストアンサー1
一般的に言えば、私はビットマスク フィールドを避けます。ビットマスク フィールドは将来読み取るのが難しいですし、理解するにはデータに関するより深い知識が必要です。
リレーショナル ソリューションは以前に提案されています。あなたが概説した例を考慮すると、次のようなものを作成します (SQL Server で)。
CREATE TABLE Users (
UserId INT IDENTITY(1, 1) PRIMARY KEY,
FirstName VARCHAR(50),
LastName VARCHAR(50),
EmailAddress VARCHAR(255)
);
CREATE TABLE Badges (
BadgeId INT IDENTITY(1, 1) PRIMARY KEY,
[Name] VARCHAR(50),
[Description] VARCHAR(255)
);
CREATE TABLE UserBadges (
UserId INT REFERENCES Users(UserId),
BadgeId INT REFERENCES Badges(BadgeId)
);