質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Q&A

解決済

3回答

5331閲覧

sqlアンチパターンであるジェイウォークをあえて使う場合

annderber

総合スコア98

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

1グッド

2クリップ

投稿2018/01/11 01:46

編集2018/01/11 02:16

お世話になります。

sqlアンチパターンの1つであるジェイウォークですが、
チェックボックスの値の格納なんかに私は結構使います。

検索条件に含まれない(mysqlなら専用の関数があります,インデックスは付けられないですが)、他テーブルと紐付いていない、対象フィールドの仕様変更の可能性が低い、という条件下で採用します。

あえて使うのは単純にテーブル構成を把握し易い、カンマ区切りで格納するとプログラム側で配列で扱いやすいなどです。特に別フィールドにしないのは配列で扱いやすくするためです。

mysqlには独自のデータ型でset型というジェイウォーク専用データ型まであります!

ジェイウォークを採用している方いますでしょうか。
逆にジェイウォークはやっぱり駄目だという方は理由を教えていただきたいです。

抽象的な質問ですが
よろしくお願いいたします

umyu👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

私も使わないほうがいいと思っています。

テーブル構成を把握し易い

自分が設計しているか最初から参画しているから把握しているだけで、
他人が設計したものや途中から参画した場合には把握しにくいです。

プログラム側で配列で扱いやすい

javaでやると概ね文字列になるので、おそらく扱い辛いです。

set型は例えばチェックボックスの複数選択に対応するもので、
特異にジェイウォークを推奨するものではありません。

あえて使う理由があるならば、
引継ぎした既存システムがそういう思想で作られていることが分かったら使うかもしれません。

開発目線ではなく、
運用目線で考えてもらうと使わないほうがいいと思えるかもしれません。
例えば、「1,0,3,0,0」の4番目の「0」がシステムバグで本当は「5」だった場合にパッチがすごく面倒です。

投稿2018/01/11 04:22

szk.

総合スコア1400

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

annderber

2018/01/11 05:24

コメントありがとうございます。 確かに運用目線では考えていなかったです。 やはり別フィールドにするか、別テーブルにした方がいいですかね。
guest

0

たまに使用します。
データ量が半端ない場合、正規化で別テーブルにすることで増加するサイズも半端なく増えます。
あくまで照会系として参照しかしないテーブルであれば、配列として折りたたんでおきます。

その他として、意図したジェイウォークということではなく、全文検索はデータをジェイウォークとして捉えて処理しているものです。

postgresは配列に対してインデックスを作成でき、配列に対する演算子も提供されるので、joinする項目としても扱うことができます。

デメリットとして考えられるのはやはり更新が絡む場合には、処理が複雑になるということでしょうか。

プログラム側で配列として扱いたいということなら、折衷案としてデータは正規化した状態で、抽出時に配列にする(MySQLであれば、GROUP_CONCAT()、postgresならarray_agg())というのも1案ではないでしょうか。

個人的にはデータを配列で扱う事には色々な工夫の余地があると思っています。

投稿2018/01/11 04:21

sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

himakuma

2018/01/11 04:34

何も検証せずに聞くのですが、postgresqlの配列にインデックス、joinなどを行った場合、 通常のカラムのインデックス、joinなどと性能は変わりないのでしょうか?
sazi

2018/01/11 05:51 編集

データの分布にもよりますが、検索する行の件数が減ることにより、高速になる場合が多いかと
annderber

2018/01/11 05:21

コメントありがとうございます。 やはり純粋なデータ格納用には使わないみたいですね。
guest

0

ベストアンサー

個人的意見になりますが、基本的には使いません。

使う条件
・システムの規模が小さい
・検索条件に含まれない(今後も絶対含まれない)
・他のテーブルの情報に絶対紐づかない(絶対!!)
・障害発生時に、調査対象になりえない、または、データ構成上1レコードに特定される調査になる
・そのカラムに値が設定されていなくても、プログラムが動く(デフォルト値など)
・業務プログラムなどのシステムの根幹には、関係ない(個人ごとに背景色変えたいとか)
・特定の機能のみ(画面だったら1画面限定とか、複数画面で使用しない)
・その項目の保存順が、処理に影響ないこと
・数値である、または、固定の文字列であること

使わない理由
・検索できない、または、しずらい
・値に何が設定されているかわからない(多次元配列だったら最悪)
・DB定義で回避できる(把握し安さより、その後の改修に与える影響がでかい)
・配列として扱いたいなら、group by等を使えば、SQL上で解決可能
・その後の基盤更改時などに影響がでかい(データの移行等がやりずらい)

個人的意見なので、ご指摘等あればよろしくお願いします。

投稿2018/01/11 02:56

編集2018/01/11 06:04
himakuma

総合スコア952

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

annderber

2018/01/11 05:20 編集

コメントありがとうございます。 参照のみならアリでしょうか。 例えば、画面表示用のチェックボックスの値を格納するテーブルを作成したとして、 項目名   | 値 permission | r,w,x みたいな形にする。
himakuma

2018/01/11 06:01

揚げ足をとるような回答になってしまうのですが、 チェックボックスなどの入力項目を表示する場合、 参照用であっても、登録する処理が存在すると思うので、控えた方が良いと思います。 参照用とするというのは、その時点で値が確定して、不変の値になる場合です。 permissionを例に挙げていますが、この場合も、DB上はlinuxのパーミッションのように1,2,4を足した値を格納するようにするのが良いと思います。
annderber

2018/01/11 06:27

ありがとうございます。参考になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問