1

シナリオ:2つのテーブルがあります。表1にはユーザーが、表2には趣味が含まれています ユーザーは複数の趣味(20-40)を持つことができます。ユーザー数は100,000を超えています。カンマ区切りの値とデータの処理と処理に基づいてSQL Serverにデータを格納するための複数行アプローチ

アプローチ1.ユーザーIDとして列1、趣味として列2を持つUsersHobby表を作成し、趣味をカンマ区切り値として格納します。行数が減ります。たとえば、100kユーザーがおり、それぞれに少なくとも20の趣味がありますが、まだ行数は100kになります。しかし、それは正規化原則に違反している。

アプローチ2。ユーザーIDとして列1、趣味として列2を選択し、各趣味ごとに新しい行を格納します。この場合、100,000人のユーザーがいる場合、行の総数は200万になりますが、正規化の原則に従います。

パフォーマンスとデータの扱いやすさを考慮すると、どちらが良いアプローチですか?

+2

アプローチ2が良いでしょう。私はあなたが詳細については、このリンクを参照する必要がありますと考えていますhttp://stackoverflow.com/a/39724908/7967350his – Saveen

+4

***単一のセルに複数の値を格納することは絶対に***!期間。これは**基本的な**リレーショナルデザインの原則に反するものであり、長期的には無限の悲しみやトラブルを引き起こします。あなたは間違いなく、3つの通常のリレーショナルデザインに固執する必要があります。そして、複数の値を1つのセルに入れることは、最初の通常のフォームに既に違反しています。** –

+0

@marc_s容認しますが、のデータ。 –

答えて

0

アプローチ2は、正規化と適切なインデックスのためにより良いでしょう。 SQL Server 2012を使用しているため、インサートの頻度が低く、読み取り頻度が高い場合は、Non-Clustered Column Storeインデックスを使用できます。非クラスタ化されたColumnStoreインデックスは内部的に圧縮を適用し、より高速なIOを実現します。

アプローチ2では、あなたはアプローチのように1

をカンマ区切り値の処理中にIOよりも速くなる高速化IOを持つために圧縮を適用することができますが、このカンマを必要と頻繁にUI要件を持っている場合UIに表示される値とは別に、アプローチ1を検討しますが、データをコンマ区切りにするカスタム・アプローチが必要なため、挿入/更新が非常に遅いという欠点があります。その時にパースを解除する必要があるほど遅くなります。

関連する問題