回答:
過去にこれを2つの方法で行いました-単一行テーブルとキー/値ペアテーブル-それぞれのアプローチには良い点と悪い点があります。
単一行オプションは、操作するのがはるかに簡単です。これは、各設定をデータベースの正しいタイプで保存でき、設定のタイプとルックアップキーをコードに保存する必要がないためです。
このアプローチを使用する際に心配したことの1つは、「特別な」単一行設定テーブルに複数の行があることでした。(SQL Serverで)私はこれを克服しました:
これは、ビット列の値が0でなければならないため、テーブルに存在できる行は1つだけですが、一意の制約のため、その値を持つ行は1つしか存在できないことを意味します。
(少なくとも)情報タイプと情報値の列を持つテーブルを作成する必要があります。これにより、新しい情報が追加されるたびに新しい列を作成する必要がなくなります。
1つの行で問題なく動作します。それは強い型さえ持っています:
show_borders bit
admin_name varchar(50)
max_users int
1つの欠点はalter table
、新しい設定を追加するためにスキーマの変更()が必要になることです。代替案の1つは、次のようなテーブルになる正規化です。
pref_name varchar(50) primary key
pref_value varchar(50)
これには弱い型(すべてがvarchar)がありますが、新しい設定を追加することは、単に行を追加することであり、データベースの書き込みアクセスだけで実行できるものです。
ご想像のとおり、最も単純な状況を除いて、すべての構成パラメーターを単一の行に配置することには多くの欠点があります。それは悪い考えです...
構成やユーザー設定タイプの情報を格納する便利な方法はXMLです。多くのDBMSがXMLデータ型をサポートしています。XML構文を使用すると、構成が進化するにつれて、構成を記述する「言語」と構造を拡張できます。XMLの利点の1つは、階層構造を暗黙的にサポートすることです。たとえば、番号付きのサフィックスを使用して名前を付けなくても、構成パラメーターの小さなリストを格納できます。XML形式の考えられる欠点は、このデータの検索と一般的な変更が他のアプローチほど単純ではないことです(複雑ではありませんが、単純/自然ではありません)。
リレーショナルモデルに近いままにする場合は、Entity-Attribute-Valueモデルがおそらく必要です。これにより、個々の値は通常次のようなテーブルに格納されます。
EntityId (foreign key to the "owner" of this attribute)
AttributeId (foreign key to the "metadata" table where the attribute is defined)
StringValue (it is often convenient to have different columns of different types
IntValue allowing to store the various attributes in a format that befits
them)
これにより、AttributeIdは、可能な各属性(ここでは「構成パラメータ」)が定義されているテーブルへの外部キーです。
AttributeId (Primary Key)
Name
AttributeType (some code S = string, I = Int etc.)
Required (some boolean indicating that this is required)
Some_other_fields (for example to define in which order these attributes get displayed etc...)
最後にEntityIdを使用すると、これらのさまざまな属性を「所有」するエンティティを特定できます。あなたの場合、管理する構成が1つしかない場合、それはUserIdである可能性があります。
EAVモデルは、アプリケーションの進化に伴って可能な構成パラメーターのリストを拡張できるようにするほかに、「メタデータ」、つまり属性自体に関連するデータをデータテーブルに配置するため、一般的に見られる列名のすべてのハードコーディングを回避できます構成パラメーターが単一行に格納されている場合。
これを行う一般的な方法は、プロパティファイルに似た「プロパティ」テーブルを用意することです。ここには、すべてのアプリの定数を格納するか、必要なだけの定数ではないものを格納できます。
その後、必要に応じてこのテーブルから情報を取得できます。同様に、他に保存する設定があることがわかった場合は、それを追加できます。次に例を示します。
property_entry_table
[id, scope, refId, propertyName, propertyValue, propertyType]
1, 0, 1, "COMPANY_INFO", "Acme Tools", "ADMIN"
2, 0, 1, "SHIPPING_ID", "12333484", "ADMIN"
3, 0, 1, "PAYPAL_KEY", "2143123412341", "ADMIN"
4, 0, 1, "PAYPAL_KEY", "123412341234123", "ADMIN"
5, 0, 1, "NOTIF_PREF", "ON", "ADMIN"
6, 0, 2, "NOTIF_PREF", "OFF", "ADMIN"
このようにして、あなたが持っているデータと、来年持ってまだ知らないデータを保存することができます:)。
この例では、スコープとrefIdをバックエンドで必要なものに使用できます。したがって、propertyType "ADMIN"にスコープ0 refId 2がある場合、それがどの設定であるかがわかります。
プロパティタイプは、いつかここにも管理者以外の情報を格納する必要がある場合に役立ちます。
このようにカートデータを格納したり、そのためにルックアップを保存したりしないでください。ただし、データがシステム固有の場合は、この方法を使用できます。
例:DATABASE_VERSIONを保存する場合は、次のようなテーブルを使用します。そうすることで、アプリをアップグレードする必要があるときに、プロパティテーブルをチェックして、クライアントにあるソフトウェアのバージョンを確認できます。
ポイントは、カートに関連するものにこれを使用しないことです。明確に定義されたリレーショナルテーブルでビジネスロジックを維持します。プロパティテーブルはシステム情報専用です。
主要なタイプごとに1つの列と、データがどの列にあるかを示す1つの列を追加することにより、変換なしでキーと値のペアを実行できます。
したがって、テーブルは次のようになります。
id, column_num, property_name, intValue, floatValue, charValue, dateValue
1, 1, weeks, 51, , ,
2, 2, pi, , 3.14159, ,
3, 4, FiscYearEnd, , , , 1/31/2015
4, 3, CompanyName, , , ACME,
それはもう少し多くの部屋を使用しますが、多くても数十の属性を使用しています。column_num値のcaseステートメントを使用して、正しいフィールドをプル/結合できます。
すみません、そうです、後で。とにかく、私がすることはシンプルで効果的です。3つの()列を持つテーブルを作成するだけです。
ID-整数(11)
名前-varchar(64)
値-テキスト
新しい構成列を作成、更新、または読み取る前に行うことは、「値」をシリアル化することです。このように私はタイプを確信しています(まあ、phpは:)です)
例えば:
b:0; B OOLEAN 用です(false)
b:1; B OOLEAN 用です(true)
i:1988; 私は NT 用です
s:5: "Kader"; 5文字の長さのS TRING 用です
これが役に立てば幸いです:)
i:1988
2つの情報を1つの列にまとめようとしているようです。
echo (int) $var
整数や他の型のために何かをすることによってあなたの意味?