0

1 対 1 の関係がある場合にデータベース テーブルにデータを配置するための正しい/最も効率的な方法について混乱しています。

たとえば、users テーブルがあります。

私は今、各ユーザーが自分の現在の国の場所を述べられるようにしたいと考えています.

次に、現在の場所でユーザーのデータテーブルを検索できるようにしたいと考えています。

私がこれを行った方法は、3 つの別々のテーブルを作成することです。すなわち

表 1 - users : ユーザー情報のみが含まれます。

CREATE TABLE users(
id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
firstName VARCHAR(30) NOT NULL,
lastName VARCHAR(40) NOT NULL,
);  

表 2 の国リスト: 国と各国の ID のリスト

PHP Code:
CREATE TABLE countrylist(
country_id MEDIUMINT UNSIGNED NOT NULL, 
country VARCHAR(60) NOT NULL,
INDEX country_id ( country_id, country ), 
INDEX countrylist (country, country_id ), 
UNIQUE KEY (country)

); 

表 3; userId と彼が住んでいる countryId が含まれています。

PHP Code:
CREATE TABLE user_countrylocation(
country_id VARCHAR(60) NOT NULL,
id MEDIUMINT UNSIGNED NOT NULL, 
INDEX country_id (country_id, id ), 
INDEX user_id (id, country_id ) 
);  

または、countryId を users テーブルに配置して、user_countrylocation を完全に削除する必要があります。つまり、各ユーザーの列に、彼が住んでいる国の country_id を配置します。

問題は、ユーザーの詳細を示す、上記と同様のテーブルが 20 以上あることです。つまり、話されている言語、年齢層、国籍などです。

私の懸念は、この一意の情報を user テーブルの各 users 列に配置した場合、データベースを検索する最も効率的な方法は何かということです。それが、上記のスタイルを選択した理由です。

ですから、データベースを計画するための最も効率的で正しい方法についてアドバイスをお願いします。

4

2 に答える 2

0

巨大なデータを扱う場合は、同じアプローチを維持し、次の方法を使用して 1 対 1 の制約を満たす必要があります。

膨大なデータがない場合は、国などの参照テーブルを保持し、列でユーザーの参照を使用する必要があります。ただし、そのようなオプションの情報列をnull可能にするnullを許可する必要がある場合があります。

最も効率的で正確な方法は、更新するユーザーの 3 番目のテーブル "user_countrylocation" からデータを最初に削除することです。次に、ユーザーの新しい場所を挿入します。トランザクションを使用することを忘れないでください。

あなたのテーブル3は持っているべきです

country_id MEDIUMINT UNSIGNED NOT NULL,

それ以外の

country_id VARCHAR(60) NOT NULL,

また、すべてのテーブルで列名を id から user_id に変更します。

ストアドプロシージャを使用している場合は、次のようになります

create procedure sp_UpdateUserCurrentCountry (
                 @userID MEDIUMINT UNSIGNED,
                 @CountryID MEDIUMINT UNSIGNED)

begin 
as
   delete from user_countrylocation
   where user_id = @userID

insert into user_countrylocation
           (
           country_id,
           user_id
           )
 values
           (
           @CountryID,
           @userID
           )
END
于 2013-10-05T15:07:58.720 に答える
0

1 対 1 の関係は、通常、2 つのテーブルをリンクする外部キーを介してマップされます。3 番目のマッピング テーブルは、多対多の関係でのみ必要です。したがって、理想的にはCountry_IDUsersテーブルに外部キーが必要です。

クエリSELECTは次のようになります

SELECT * FROM Users
WHERE Country_ID = (
    SELECT Country_ID FROM Countries
    WHERE Country_Name = 'USA'
);
于 2013-10-05T14:33:55.730 に答える