ホームページ  >  記事  >  バックエンド開発  >  1 つのフィールドに複数の値がある場合のデータベース設計の問題

1 つのフィールドに複数の値がある場合のデータベース設計の問題

WBOY
WBOYオリジナル
2016-06-23 14:20:341441ブラウズ

これでフィールド A ができました。値は単一です。たとえば、値は 3 です
複数の値を持つフィールドがあります。たとえば、フィールド B の値は 1、2、3、または 4 である可能性があります。次に、フィールド A の値を含むすべてのレコードを検索する必要があります。例:

レコード 1:3、5、7 (一致)
レコード 2:6、8、9 (一致しない)

データベースをより合理的に設計するにはどうすればよいでしょうか?パフォーマンスの最適化が十分に考慮されています。


ディスカッションへの返信(解決策)

方法を思いついたようです。

これは、フィールド B のデータがデータベースに保存される方法です
|2|4|6|3|
3. が含まれているかどうかをクエリしたい場合は、%|3|% のようにします。これは可能でしょうか?

はい、またはカンマで区切ることもできます。

値の範囲が 64 を超えない場合は、set 型を直接使用できます

set 型を使用したくない場合は、値の範囲を 64 より大きくすることができます
その後、varchar または text を使用できますtype
データは、2、4、6、3 などのカンマ区切りの文字列で構成されます
mysql は、検索作業を完了するための find_in_set 関数を提供します

値の範囲が 64 を超えない場合、set タイプを直接使用できます

set タイプを使用したくない場合は、値の範囲を 64 よりもはるかに大きくすることができます
その場合は、varchar または text タイプを使用できます
データは、2,4,6,3 などのカンマ区切りの文字列で構成されます
mysql には、検索を完了するための find_in_set 関数が用意されています

最適な解決策を教えていただけますか?
値の範囲が非常に少ない。 20以下。値は固定配列から選択されます。
今ではパフォーマンスをもっと気にするようになりました。数万から数十万を追加すると、一致するデータを見つけるのに時間がかかりすぎます。

値の範囲が 64 を超えない場合は、set 型を直接使用できます

set 型を使用したくない場合は、値の範囲を 64 より大きくすることができます
その後、varchar または text を使用できますtype
データは 2 ,4,6,3 などのカンマ区切りの文字列で構成されます
mysql は検索作業を完了するための find_in_set 関数を提供します

学習しました。 mysqlのフィールドにはセットタイプがあることを初めて理解しました。 Mysql には find_in_set 関数もあります
どちらの方法でも問題を解決できます。時間があるときに、どの方法が最も速いか個人的にテストしてみます。

like と find_in_set と in

はすべて「その中にあるかどうか」を尋ねており、パフォーマンスは決して高くありません
データをまとめてパックすることは、時間をスペースと交換する方法です

高速化を実現したい場合もちろん、一緒にパッケージ化することはできませんが、独立して保存され、インデックスが付けられます。もちろん、ホストの ID を追加する必要があります
これは、いわゆる空間と時間の交換です

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。