0

ユーザーがカスタム フィールドを設定できるサンプル PHP アプリはありますか?

アドレス帳など。mySQL でデータベース列を使用せずに、ホーム、ホーム アウェイなどのフィールドを設定するなど。好きなだけフィールドを持ち、好きなように名前を付けることができます。

したがって、結果は次のようになります。

| #   | Name  | DOB    | Address 1     | Health  
| 1   | Scott | 7/1/12 | 2222 Jackson  |  GOOD

別のデータセットは

| # | Name  | Expertise Level | Contact Info    
| 1 | Scott | High            | 408-555-5555

それがどのように行われるのか、私は興味があります。すべてが単一の mysql テーブルに JSON として保存されますか? また、各フィールドのデータはどのように保存されるのでしょうか?

すでにこれを行っている PHP スクリプトはありますか?

4

3 に答える 3

10

これは MySQL でタグ付けされているため、柔軟なデータベース テーブルを作成する方法があります。次のような名前と値のペアを含むテーブルを作成できます。

create table YourTable
(
  id int,
  name varchar(50),
  attribute varchar(50),
  value varchar(50)
);

insert into yourtable
values(1, 'Scott', 'DOB', '07/01/2012'),
  (1, 'Scott', 'Address 1', '2222 Jackson'),
  (1, 'Scott', 'Health', 'Good'),
  (1, 'Scott', 'Expertise Level', 'High'),
  (1, 'Scott', 'Contact Info', '408-555-5555');

これは とも呼ばれますEntity-Attribute-Value。このタイプの構造を使用することには、長所と短所があります。

このデータをクエリするには、複数の結合を実行するか、データをピボットして列に入れる必要があります。

これは、このタイプの構造 (EAV) の概要を示すDBA.SE に関する質問です。

CASE次のステートメントで集計関数を使用してデータをクエリできます。

select id,
  name,
  max(case when attribute = 'DOB' then value end) DOB,
  max(case when attribute = 'Address 1' then value end) Address1,
  max(case when attribute = 'Health' then value end) Health
from yourtable
group by id, name;

複数の結合を実行する場合、クエリは次のようになります。

select t1.id,
  t1.name,
  t1.value DOB,
  t2.value Address1,
  t3.value Health
from yourtable t1
left join yourtable t2
  on t1.id = t2.id
  and t1.name = t2.name
  and t2.attribute='Address 1'
left join yourtable t3
  on t1.id = t3.id
  and t1.name = t3.name
  and t3.attribute='Health'
where t1.attribute = 'DOB';

データ取得のデモで SQL Fiddle を参照してください。

于 2013-01-03T23:18:39.540 に答える
1

オブジェクト間で共通の列を持つテーブルを常に持つことができます。あなたの例のようIDName。また、各オブジェクトDataの残りの部分を格納する という追加の列もあります。に、または としてcustom fields保存できます。jsonxmlserialized php object

PHPのシリアル化およびシリアル化解除関数を見ることができます。

于 2013-01-03T23:16:42.790 に答える
1

カスタム フィールドを作成する方法はたくさんあります。それぞれに長所と短所があります。

通常、シリアル化は推奨されません。用途がある場合もありますが、リレーショナル データをリレーショナルにする多くの要素が失われます。特定のフィールドでインデックスを作成したり検索したりする効果的な方法もありません。

すべてのデータ フィールドをリレーショナルにすると、必要なときにデータにアクセスするための非常に複雑なクエリ/結合が作成される可能性があります。

MongoDB の使用がオプションになる場合があります。データ セットごとに一意のコレクションを作成し、各セットに適切なインデックスを追加できます。スキーマレスなので、テーブルを作成する必要はありません。データを挿入するだけです。ただし、その制限を理解するには時間がかかります。

別のオプションとして、データセットによっては、カスタム データに使用されるフィールドをプロビジョニングすることもできますが、一般的なフィールドは通常の行の一部になります。ただし、提供できるカスタム フィールドの数は制限されます。

于 2013-01-03T23:18:29.837 に答える