1

あるアプリケーションでは、ユーザーは目的の場所/都市を選択できます。都市リストは、次のようなチェックボックスのあるツリー構造になります。

[x]Country
-[x]State 1
--[x]City 1
--[x]City 2
--[x]City 100
-[X]State 2
--[x]City 1
--[x]City 2
--[x]City 100
[x]Country 2

……

ここで、ユーザーが国を選択すると、すべての州と都市が表示されます。1 つ以上の州とそれらの州を選択すると、そのユーザーの都市と国も保存されます。ユーザーは 1 つ以上の国を選択できます。また、ユーザーは任意の都市または州のチェックを外すことができます。

データの保存と取得の方法を教えてください。MySql と Php を使用しています。ルックアップ テーブルは理想的でしょうか? または、テキスト型の列に json 形式ですべての場所 ID およびストアをグランドに入れることはできますか?

ありがとう!

4

3 に答える 3

3

データの保存と取得の方法を教えてください。MySql と Php を使用しています。ルックアップ テーブルは理想的でしょうか?

国、州、都市を保存するには、正規化されたデータベース スキーマを使用する必要があります。国には州があります。州には都市があります。ジャンクション テーブルが必要です。

または、テキスト型の列に json 形式ですべての場所 ID およびストアをグランドに入れることはできますか?

いいえ、それは通常のフォームではありません。そして、それは多くの問題を引き起こします。簡単に CRUD 操作を実行することはできません。

データベース スキーマ

create table countires(name varchar(100) primary key);
create table sates(name varchar(100) primary key, country varchar(100), foreign key `country` references `countries`(`name`)); 
create table cities(name varchar(100) primary key, state varchar(100), foreign key `state` references `states`(`name`)); 

これで、これらのテーブルに対してさまざまな種類のクエリを実行できます。ユーザーが都市 ( city1city2)、国cntry1、州を選択したとしますstt2

クエリ

ユーザーが選択したすべての都市を検索します。

SELECT ct.name 
FROM   cities AS ct 
       JOIN states AS st 
         ON ( st.name = city.state ) 
       JOIN countries AS cn 
         ON ( cn.name = st.country ) 
WHERE  ct.name IN ( 'city1', 'city2' ) 
        OR cn.name = 'cntry1' 
        OR st.name = 'stt2'; 

ユーザーが選択したすべての州を検索します。

SELECT st.name 
FROM   states AS st 
       JOIN countries AS cn 
         ON ( cn.name = st.country ) 
WHERE   OR cn.name = 'cntry1' 
        OR st.name = 'stt2'; 

更新 1

ユーザーとの関係を維持するには?

ジャンクション テーブルが必要です。3つ作るだけ。

create table users(name varchar(100) primary key);
CREATE TABLE user_countries 
  ( 
     user    VARCHAR(100), 
     country VARCHAR(100), 
     PRIMARY KEY (`user`, `country`), 
     FOREIGN KEY (`user`) REFERENCES `users`(`name`)
     FOREIGN KEY (`counry`) REFERENCES `countries`(`name`)    
  ); 
CREATE TABLE user_states 
  ( 
     user    VARCHAR(100), 
     state   VARCHAR(100), 
     PRIMARY KEY (`user`, `state`), 
     FOREIGN KEY (`user`) REFERENCES `users`(`name`) 
     FOREIGN KEY (`state`) REFERENCES `states`(`name`)    
  ); 
CREATE TABLE user_cities 
  ( 
     user    VARCHAR(100), 
     city    VARCHAR(100), 
     PRIMARY KEY (`user`, `city`), 
     FOREIGN KEY (`user`) REFERENCES `users`(`name`) 
     FOREIGN KEY (`city`) REFERENCES `cities`(`name`)    
  );
于 2012-12-19T18:54:03.737 に答える
0

保存されたデータにどのようにアクセスする必要があるかによって異なります。送信したユーザーに基づいてデータを検索するだけの場合、シリアル化されたツリー データ (つまり、JSON、PHP シリアル化など) を関連付けられたデータベース レコードに保存できない理由はおそらくないでしょう。ユーザー。ちなみに、これは NoSQL データ ストアの良いユース ケースでもあります。

ただし、特定の国、州、または都市が選択されているすべてのユーザーを検索できるようにする必要がある場合は、この方法でクエリできるようにデータを保存する必要があります。これは、ユーザーをそれぞれに関連付けるテーブルを持つ国、州、および都市の個別のテーブルを意味する場合もあれば、ユーザーを管轄区域に関連付けるテーブルと共に、その中にさまざまな種類の管轄区域を許可する単一の管轄区域テーブルを意味する場合もあります。スキーマにどのようにアプローチするかは、国、州、および都市を互いにどのように扱う必要があるかによって異なります (つまり、各管轄区域のタイプは大幅に異なる属性を持つ必要があります)。

于 2012-12-19T18:53:51.840 に答える
0

選択した値のみを保存し、残りを導出することをお勧めします。はい、データを取得するのは少し面倒ですが、いくつかの重要な利点があります。

ソース データが変更されても、引き続き正確になります。ソビエト連邦が崩壊したときに、このアプリケーションを実行していたと想像してください。「USSR」エントリを「ロシア」に変換し、一連の「州」を国に変換します。モデルでは、これにより大量のユーザー データが変更されます。ただし、派生モデルを使用すると、これははるかに簡単になります。都市が選択されている人は、その都市が適切な国に割り当てられると自動的に修正されます。州が選択されている多くの人々は、代わりに国が選択されていることに突然気付くかもしれませんが、そのレベルの下の都市は自動的に修正されます.

これにより、作成、更新、および削除操作が簡素化されます。数百または数千の行を書き込む代わりに、すべての変更が 1 つの行にのみ影響します。

于 2012-12-19T19:16:19.920 に答える