2016-12-08 10 views
1

データフィールド

私はデータベーステーブル構造を設計しています。異なる企業の従業員プロファイルを記録する必要があるとします。私たちは、次のフィールドがあります複合主キー:別の属性を使用して1つの属性を見つける

+---------+--------------+-----+--------+-----+ 
| Company | EmployeeName | Age | Gender | Tel | 
+---------+--------------+-----+--------+-----+ 

それは別の会社から二人の従業員が同じ名前を持っている(とNO 2従業員が同じ会社で同じ名前を持っていないと仮定)ことが可能です。この場合、複合主キー(Company, EmployeeName)は私の意見では必要であろう。

検索

は今、私は主キーのみで2つのいずれかの属性を使用して、すべての情報を取得する必要があります。

SELECT EmployeeName, Age, Gender, Tel FROM table WHERE Company = 'Company A' 

そして、私はまた、別の会社からのすべての従業員は、ドナルドの名前を検索することができます:ために

SELECT Company, Age, Gender, Tel FROM table WHERE EmployeeName = 'Donald' 

戦略

を例えば、 は、私はA社のすべての従業員のプロフィールを検索したいですこの要件を実装するには、すべてのデータを1つのテーブルに格納するという戦略があります。これは読みやすく理解しやすいものです。しかし、クエリがすべての行を反復処理する必要があるため、検索に時間がかかることがあります。私はできるだけ早くこれらの情報を検索したいと思います。これにはよりよい戦略がありますか?データベースに応じて、アイデンティティ/自動インクリメント/シリアル -

答えて

1

まず、あなたの行は、各行の一意の識別子を持っている必要があります。第二に、あなたは名前がユニークであることを再考するかもしれません。同じ会社の2人が同じ名前を持っていないのはなぜですか?いずれの場合においても

、あなたは上の主キー、たとえば、(company, name)を持っています。

create index idx_profiles_name_company on profiles(name, company); 
0

各行のアイデンティティのためのゴードンの提案を説明する注記:反対の検索のためには、単に(name, company)上の別のインデックスをしたいです。これは彼の答えの補足です。理論的には

列を横断し、私は二次キー(ユニークすなわち、nullではない)としてのアイデンティティ値を持ち、自然主キーを指定したいとPostgreSQLのようなDBの主キーには何の問題もありません。もちろん、MS SQL ServerやMySQL/InnoDBでは問題のレシピになります。私はまた、このルールを破る時​​があるので、「すべて」ではなく「ほぼすべて」と言っています。

はかかわらず、アイデンティティ列を持つことは、物事のカップルを簡素化し、それはあなたが物事が間違って取得する場合には、キーの周りの抽象化を提供します。コンポジットキーは、後で時間を食い止める(そしておそらくはダウンタイムを招く)2つの問題を提供します。これらを含める:

  1. 複合キーに参加は、多くの場合、単純な値のものよりも高価であり、
  2. 加入が​​

に関与しているとき、列を横切る自然主キーがはるかに困難であるの追加または変更しますだからあなたのDBに応じて、あなたはどちらかあなたの自然主キー独立した(ストレージおよび実装仕様に依存するあなたが行う必要があります)独自の二次キーを指定するか、または行う必要があります。

関連する問題