それが私次第である場合、私はキーと値のペアを含むルックアップテーブルを使用します。ここで、値はあなたが望むものです。このようなもの:
CREATE TABLE `lookup_rate_type`
(
`id` TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20) NOT NULL,
PRIMARY KEY (`id`), UNIQUE KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
次に、レートを参照する必要があるテーブルで、関心のあるレートに相関するIDを使用し、いくつかの行を追加します。
INSERT INTO `lookup_rate_type` SET name = 'second'; # id = 1
INSERT INTO `lookup_rate_type` SET name = 'minute'; # id = 2
INSERT INTO `lookup_rate_type` SET name = 'hour'; # id = 3
さて、あなたが評価するための参照を必要とするテーブルを持っているなら、あなたはこれをするでしょう:
INSERT INTO `some_table` SET rate = 27, rate_type_id = 3; # 27 / hour
INSERT INTO `some_table` SET rate = 3600, rate_type_id = 2; # 3600 / minute
このアプローチの良いところは、rate_typeを識別するために最初の文字だけを使用したい場合は、lookup_rate_type
テーブルを更新するだけです。
UPDATE `lookup_rate_type` SET name = 's' WHERE ID = 1 LIMIT 1;
名前の値を変更した場合でも(理解できるコンテキスト内で、2番目はsになります)、値との関係を格納するテーブルは変更されません。
このソリューションを使用すると、ルックアップテーブルに必要な数の行を追加できますが、列挙型を追加するためだけにalterステートメントを実行する必要があります。これは、大きなテーブルを処理する場合に問題になる可能性があります。
このソリューションの唯一の欠点は、アプリケーションコードがint値にアクセスできるようにするためにクラス定数を使用する必要があることです。これにより、次のようなビジネスロジックに従ってCRUD操作を実行できます。
class LookupRateType
{
const SECOND = 1;
const MINUTE = 2;
}
// Calling code example
$sql = sprintf('INSERT INTO some_table SET rate = %d, rate_type_id = %d', 27, LookupRateType::MINUTE);
また、必要に応じて、定数の小さなリストを処理する場合は、ルックアップテーブルを完全に省略して、クラス定数のみを処理できます。ここでの欠点は、クエリを使用するのではなく、特定のデータを検索するときにIDを知っている必要があることです。
# If you use class constants only, you can do this
SELECT * FROM some_table WHERE rate_type_id = (SELECT id FROM lookup_rate_type WHERE name = 'hour');
# But if you can lookup the context with the code you can simply input the id
SELECT * FROM some_table WHERE rate_type_id = 3;
これらは、さまざまなアプリケーションを処理する際に遭遇したシナリオであり、ルックアップテーブルやクラス定数が最適なソリューションであることがわかりました。