sql >> データベース >  >> RDS >> Mysql

MySQLフィールドにcsvを保存する–悪い考えですか?

    値をコンマ区切り形式で保存したくない。

    この列を他のテーブルと結合することにした場合を考えてみてください。

    あなたが持っていると考えてください、

    x  items
    1  1, 2, 3
    1  1, 4
    2  1
    

    xごとに異なる値を見つけたい場合:

    x  items
    1  1, 2, 3, 4
    2  1
    

    または、3つ含まれているかどうかを確認することもできます

    または、それらを別々の行に変換したい場合があります:

    x  items
    1  1
    1  2
    1  3
    1  1
    1  4
    2  1
    

    それは大きな苦痛になります。

    少なくとも正規化の第一原理を使用します-値ごとに別々の行を用意します。

    さて、元々あなたがテーブルとしてこれを持っていたとしましょう:

    x  item
    1  1
    1  2
    1  3
    1  1
    1  4
    2  1
    

    簡単にcsv値に変換できます:

    select x, group_concat(item order by item) items
    from t
    group by x
    

    x=1にアイテム3があるかどうかを検索する場合。簡単。

    select * from t where x = 1 and item = 3
    

    以前の場合は恐ろしいを使用していました find_in_set

    select * from t where x = 1 and find_in_set(3, items);
    

    CSV値でlikeを使用して検索できると思われる場合は、最初にlike %x% インデックスは使用できません。次に、間違った結果が生成されます。
    アイテムabが存在するかどうかを確認し、%ab%を実行するとします。 abc abcdabcde....。

    の行を返します。

    多くのユーザーとアイテムがある場合は、別のテーブルusersを作成することをお勧めします PKユーザーID、別のitems PKitemidと最後にマッピングテーブルuser_item userid、itemid列があります。

    これらの値を保存および取得するだけで、結合、検索、個別化、個別の行への変換などの操作を行わないことがわかっている場合は、そうすることができます(私はまだそうしません't)。



    1. psycopg2を使用してpostgresテーブルにデータをインポートする際の値エラー

    2. mysqlクエリで文字列の最後の5文字を​​取得する

    3. LIKE演算子をDETERMINISTIC関数で使用する場合のOracle実行計画

    4. グループ化されたSQL結果の各グループの最大値を持つレコードを取得します