質問

ここで最適なソリューションは何なのかと思っています。

正規化されたデータベースがあるとします。システム全体の主キーはvarcharです。私が疑問に思っているのは、このvarcharを正規化のためにintに関連付けるべきか、それとも残すべきですか? varcharとして残す方が簡単ですが、より最適な場合があります

たとえば、私は持つことができます

People
======================
name      varchar(10)   
DoB       DateTime    
Height    int  

Phone_Number
======================
name      varchar(10)   
number    varchar(15)

または私が持つことができる

People
======================
id        int Identity   
name      varchar(10)   
DoB       DateTime  
Height    int  

Phone_Number
======================
id        int   
number    varchar(15)  

もちろん、他の1対多の関係をいくつか追加します。

皆さんはどう思いますか?どちらが良いですか?

役に立ちましたか?

解決

本当に主キーとして名前を使用できますか?同じ名前の複数の人がいる危険性は高くありませんか?

あなたの名前属性が主キーとして使用できるほど幸運な場合は、-必ず-それを使用してください。ただし、多くの場合、customer_idなどの何かを作成する必要があります。

そして最後に:" NAME"は少なくとも1つのDBMSの予約語であるため、他のものの使用を検討してください。氏名。

他のヒント

かなりのサイズの実世界のデータベースアプリケーションを開発した人の大半は、代理キーが唯一の現実的なソリューションであると言うと思います。
学界が意見を異にすることは承知していますが、それは理論的な純度と実用性の違いです。

一部のテーブルに複合主キーがある非サロゲートキーを使用するテーブル間で結合を行わなければならない合理的なサイズのクエリは、すぐにメンテナンスできなくなります。

あらゆる種類の非合成データ(つまり、アプリケーションによって生成されるのではなく、ユーザーからのデータ)をPKとして使用することには問題があります。カルチャ/ローカリゼーションの違い、大文字と小文字の区別(およびDB照合に依存するその他の問題)、ユーザーが入力したデータが変更された場合/その場合などにデータの問題が発生する可能性があることを心配する必要があります。

非ユーザー生成データ(シーケンシャルGUID(DBがそれらをサポートしない場合、またはページ分割を気にしない場合は非シーケンシャル)またはID int(GUIDが不要な場合))を使用するはるかに簡単で安全です。

重複データについて:非合成キーを使用すると、どのように保護されるかわかりません。ユーザーが「ボブ・スミス」と入力する問題がまだあります。 「ボブ・K・スミス」の代わりにまたは「スミス、ボブ」または「ボブ・スミス」鍵が合成キーか非合成キーかに関係なく、複製管理が必要です(ほぼ同じです)。また、非合成キーには、合成キーがきちんと回避する他の潜在的な問題がたくさんあります。

多くのプロジェクトではそのことを心配する必要はありません(たとえば、照合の選択肢が厳しく制限されているため、それらの多くは回避されます)が、一般的には合成キーを好みます。これは、明らかにオーガニックキーで成功できないというわけではありませんが、明らかにできますが、多くのプロジェクトではより良い選択ではありません。

VARCHARが大きければ、データベース全体でかなりの量のデータを複製していることに気付くでしょう。一方、数値ID列を使用した場合、他のテーブルに外部キー列を追加するときに、ほぼ同じ量のデータを複製することはありません。

さらに、テキストデータは比較の面で非常に苦痛です。 WHERE id = user_id を行う方が WHERE name LIKE inputname (または同様のもの)。

" name"フィールドは本当に主キーとして適切であり、それを実行します。その場合、サロゲートキーを作成しても、データベースはより正規化されません 。外部キーの重複文字列がいくつか表示されますが、サロゲートキーと同様に、FK制約が文字列の整合性を保証するため、これは正規化の問題ではありません。

ただし、「名前」が何であるかを説明していません。です。実際には、文字列が主キーとして適切であることはほとんどありません。それが人の名前である場合、複数の人が同じ名前を持つことができ、人は名前を変更することができるなどの理由で、PKとして機能しません。

他の人が言及していないように見えることの1つは、int型フィールドでの結合は、varcharフィールドでの結合よりもパフォーマンスが高い傾向があるということです。

そして、時間の経過とともに一意になることはないため、(人や企業の)名前を使用する代わりに、常に代理キーを使用することは間違いありません。たとえば、データベースには、同じ名前の100を超えるインスタンスを持つ164の名前があります。これは、名前をキーフィールドとして使用することの検討の危険性を明確に示しています。

元の質問は正規化の問題ではありません。述べたように、正規化されたデータベースがある場合、正規化の理由でそれを変更する必要はありません。

質問には2つの問題があります。 1つ目は、intsまたはvarcharsが主キーおよび外部キーとして使用するのに適しているかどうかです。 2番目は、問題の定義で指定された自然キーを使用できるか、または自然キーの代わりに合成キー(代理キー)を生成する必要があるかです。

intsはvarcharsよりも少し簡潔で、インデックス処理などの場合はもう少し効率的です。しかし、違いは圧倒的ではありません。おそらくこれだけで決定を下すべきではありません。

提供された自然キーが実際に自然キーとして機能するかどうかの問題は、はるかに重要です。 「名前」の重複の問題;列だけが問題ではありません。人が名前を変えたときに何が起こるかという問題もあります。この問題は、おそらくあなたが与えた例では表面化しませんが、他の多くのデータベースアプリケーションでは表面化します。例は、学生が受講したすべてのコースの4年間にわたる成績証明書です。女性は4年以内に結婚して名前を変えるかもしれませんが、今は行き詰まっています。

名前を変更しないでおく必要があります。その場合、実際の世界と一致しなくなるか、その人が受講したすべてのコースで遡って更新する必要があります。

合成キーを決定する場合、アプリケーションが合成キーの値をユーザーコミュニティに公開するかどうかを決定する必要があります。それはワームの別の全体の缶であり、この議論の範囲を超えています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top