2017-12-31 102 views
0

私はスキルと教育の両方の詳細のためのマトリックスをまとめることを検討しています。 competency_levelとpriority_levelは(DBまたはNULL)フォーラムで空白にすることができDBデザインのベストプラクティス:個々のエントリを持つ複数の行、または複数のエントリを持つ単一の行を返しますか?

skills_mat_id | user_id | skill | competency_level | priority_level | 

と教育のために似たような、私は列を持っています。

私はすなわち、各スキルのための別の行エントリを作成しなければならない問題がある:

1, user1, java, 7, 1 
2, user1, php, 6, 2 
3, user1, css, 4, 2 
4, user1, python, 8, NULL 

または私は同じ列内のすべてのものが必要です:

1|user1|java,php,css,python|7,6,4,8|1,2,2,NULL 

を私が最初のように感じますオプションは実装するのがずっと簡単です(NULL /空欄のためにフロントエンドで間違いが起こりにくい)が、2番目のオプションはより効率的に見え、大きなスキルのリストになる可能性のある行が1つ返されます。どちらのオプションもパフォーマンスに違いはありますか?これはフロントエンドの問題ですか?あるいは、設計の決定はDBのパフォーマンスに大きな影響を与えますか?私はこのためにMySQLを使用しますが、特にデータベースプラットフォームの一部ではありません。

私は、第2のオプションで特定のスキルを更新または削除するようなことに少し心配しています。誤ってレコードの間違った部分を削除したり更新したりする可能性を減らす方法でこれをどうやって進めるかについては、私はあまり確信していません。

「スキル」または「教育」テーブルを大幅に増やす数十万人のユーザーが潜在的に存在すると考えているため、このようなデータセットにベストプラクティスのアプローチがあるかどうか疑問に思っていましたか?

+0

正規化で間違っているのは難しいです。それが何であるか分からなければ、私はこの本「データベース設計for Mere Mortals」について良いことを聞いてきました。 –

答えて

2

単一行読み取り対複数行の最適化は、時期尚早のマイクロ最適化領域に非常に深く関わっています。 skill_mat_id + user_idでテーブルのインデックスを作成する場合、これらの列による選択は非常に高速に行う必要があります。パフォーマンスは懸念すべきではありません。 一方、カンマ形式で保存すると、エラーが発生しやすく、メンテナンスが難しく、いずれの場合でも、各スキル名を習熟して作業する必要があります。最初に機能させ、モジュール性とエレガンスを設計し、必要な場合にのみパフォーマンスを最適化してください。

このパフォーマンスが絶対に必要な場合は、それをベンチマークして追加の追加効果があるかどうか確認してください。大規模な計画ではそうはないでしょう。

0

単純な観点から、複数の行が優れています。

そうしないと、すべてのフィールドの近くでループする可能性があります。

さらに、何を保存していますか?あまりない。あなたが少数の列を置くなら、まともなスペースを節約できます。数百にすると、zipユーティリティからより良い圧縮が得られます。

簡単にするため、コードをデバッグするのが簡単です。

関連する問題