X



DB設計を語るスレ 11

0461NAME IS NULL
垢版 |
2023/08/04(金) 23:11:08.11ID:???
>>455
理論に詳しくないかどうかは議論してみれば明らかになると思うが、そもそも
「そいつ」がどう理論に詳しくないのかどの発言で分かったんだろう?
0462NAME IS NULL
垢版 |
2023/08/05(土) 00:14:46.15ID:???
>>459
判ってるから、誰も教えてあげないんだろう→わかる
実務やってるならわかるはずだから教えない→???
0463NAME IS NULL
垢版 |
2023/08/05(土) 00:51:29.67ID:???
>>457
大筋同意なんだが、NULLに運用上意味をもたせることが安全かというと、
未定・不明値には別途定義したカテゴリ値を与える方が誤解が生じにくいのも確か
0464NAME IS NULL
垢版 |
2023/08/05(土) 00:56:48.78ID:???
そこまでいくと、それはサイトのポリシーとか宗教的信念の世界になりそう
0465NAME IS NULL
垢版 |
2023/08/05(土) 07:40:36.00ID:???
そもそもNULLという設定項目があるんだから、意味はあるだろ
0466NAME IS NULL
垢版 |
2023/08/05(土) 08:18:50.26ID:???
不存在のNULLは自然だが、それ以外の何らかの値としての意味を持たせようとすると
=NULL の扱いが面倒だな。
0467NAME IS NULL
垢版 |
2023/08/05(土) 10:59:20.01ID:???
つまるところ、不存在は未定あるいは不明値なのかって話
0468NAME IS NULL
垢版 |
2023/08/05(土) 11:39:38.98ID:???
不存在ではなく
未設定という設定
0469NAME IS NULL
垢版 |
2023/08/05(土) 12:46:59.45ID:???
少なくともいまのSQLでは、他の有効な値と同列な「不明値」という一つの値として扱うことはできない。
そのうえで不存在か不明値か未設定かどう解釈するかというのは、振る舞いが同じならどう解釈しようと自由。
0470NAME IS NULL
垢版 |
2023/08/05(土) 13:00:18.60ID:???
今のSQLって具体的になんという名前のSQLですか?
0471NAME IS NULL
垢版 |
2023/08/05(土) 13:12:15.17ID:???
NULLは値が存在しないことを示すマーカー
なぜ値が存在しないのかという理由が大きく分けて2種類あって
それが「not applicable」と「unknown at present」
(コッドの言うI-ValuesとA-Values)

前者は>>463の言うように何かしらのカテゴリ値と一緒に使われることが多い
その場合はカラム間の依存性ができるので更新対象なら不整合が発生しないような考慮が必要
場合によってはサブタイピングでテーブル分割される

後者は単独で使われるほうが一般的
FKがNULLの場合なんかが一番わかりやすい
終了日をNULLにするのも一般的にはこっちのケース
0473NAME IS NULL
垢版 |
2023/08/05(土) 17:59:04.64ID:???
=NULLを認めていればこんな役に立たない議論しなくて済んだのに
3値論理自体が無用の長物
0474NAME IS NULL
垢版 |
2023/08/05(土) 18:25:57.21ID:???
これは議論ではないと思います
会話にすらなっていません
0475NAME IS NULL
垢版 |
2023/08/05(土) 18:31:00.10ID:???
確かに。文脈を理解して回答を出すというより、単語に反応して関係ない意見表明をしてるだけでChatGPT以下
0476NAME IS NULL
垢版 |
2023/08/05(土) 18:57:27.47ID:???
要はNUMBERやVARCHARといった型の定義域の外の値が1個使えたらいいのにって話だな。それにNULLを充てれば、と。
でもそれが1個ならいいけどそうとも限らんしな。
0477NAME IS NULL
垢版 |
2023/08/05(土) 23:03:29.67ID:xddGTzFC
>>473
CUIの時代だと空を見た目で表現するのが難しい。
いまでも文字列として「NULL」とか「(NULL)」という列値を設定するプログラマがいる。

値が設定されていないことをチェックする構文を常に書かないといけないことになったら、そっちの方が面倒なことになる。
0478NAME IS NULL
垢版 |
2023/08/05(土) 23:17:20.60ID:???
実際の現場って形通りやってないと思う
多少アンチパターンでも動くのを優先してるかと
0479NAME IS NULL
垢版 |
2023/08/06(日) 21:46:12.17ID:???
上でも書いたけど適用日がたんなる参照項目ならnullでも構わないけど
範囲指定なんかにも使われる場合、コードの実装時に面倒だからそういう事があるならnullで持たないほうがいいと思うけどな
0480NAME IS NULL
垢版 |
2023/08/06(日) 22:01:46.99ID:???
範囲指定する場合は、そもそも検索対象から外されているだろう
0481NAME IS NULL
垢版 |
2023/08/06(日) 22:29:11.75ID:???
開始日と終了日が無限小/無限大のケースがあるならそれをNULLで表現すると
範囲検索のクエリがやや複雑になるね。
0482NAME IS NULL
垢版 |
2023/08/06(日) 22:48:01.22ID:???
出題者からそういう依頼は出ていないので考えなくて良い
0483NAME IS NULL
垢版 |
2023/08/07(月) 00:28:09.95ID:???
バグったときのリスクを考えるとNULLよりもセンティネル値のほうがベターだとは思うが
SQL2011のapplication time periods機能でNULLがunboundとして扱われるDBMSもあるのでその場合はNULLで十分だと思う
0484NAME IS NULL
垢版 |
2023/08/08(火) 22:02:57.62ID:cLfdUeWR
設計を語るスレなのに、IS NULL検索が頻発する設計がいいらしいw
0485NAME IS NULL
垢版 |
2023/08/08(火) 22:36:03.34ID:???
NULLを使っていてもIS NULL検索が不要になるんだよ
0486NAME IS NULL
垢版 |
2023/08/09(水) 20:10:46.59ID:JdJxxmkU
質問者がNULLが嫌だと言い始めたのがこの話題なんだが?
0487NAME IS NULL
垢版 |
2023/08/09(水) 20:16:02.27ID:JdJxxmkU
開始日がNULLかどうか調べないと、データの状態がわからないというデータモデルが好きらしいから、勝手にやればいいんじゃない。
0488NAME IS NULL
垢版 |
2023/08/09(水) 21:09:23.48ID:???
別にNUKKが嫌だとは言ってないだろう
選択肢として色々言ってるだけだ
0489NAME IS NULL
垢版 |
2023/08/09(水) 21:17:17.07ID:???
自分が設計する際は条件指定される項目にNULLは許してないけどそれを許可する人もいるだろうぐらいの認識だわ
かりに今回みたいな適用期間をNULL不可にした場合は暫定的な日付を入れることになるから
登録・更新時や画面に表示する際に考慮が必要だけど
少なくとも検索にNULLを考慮した条件を記載するよりは不具合も起きにくいと思ってる
登録更新時にNULLを何らかの日付に変換し忘れ→SQLエラーになる
画面表示時に日付をNULLに変換し忘れ→変な日付がでる
0490NAME IS NULL
垢版 |
2023/08/09(水) 23:15:28.70ID:???
入力し忘れなんてのは、今回の質問とは無関係だろう
0491NAME IS NULL
垢版 |
2023/08/09(水) 23:16:35.78ID:???
なんで条件を勝手に付け加えるんだろう
その方が不思議でならない
0492NAME IS NULL
垢版 |
2023/08/09(水) 23:26:01.97ID:???
>>490
入力し忘れの話は誰もしてなくね?
0493NAME IS NULL
垢版 |
2023/08/09(水) 23:42:39.89ID:???
>登録更新時にNULLを何らかの日付に変換し忘れ

とは言ってる
0494NAME IS NULL
垢版 |
2023/08/10(木) 07:32:58.92ID:???
489書いたの俺だけど入力し忘れではなく
画面適用日の開始や終了が空欄(日付指定なし)の場合はDB上は1900-01-01や2999-12-31といった値に置き換えて更新
画面表示の際は1900-01-01や2999-12-31の場合は空欄にするって意味だったけど伝わらなかったみたいだね
すまんね
0495NAME IS NULL
垢版 |
2023/08/10(木) 11:27:56.59ID:???
>>491
要件が不十分だからでしょ
要件が不十分だったり不明瞭なら
ある程度までは前提を追加して案を考えるのが設計というもの
0496NAME IS NULL
垢版 |
2023/08/10(木) 11:33:18.40ID:???
いや、要件を依頼者とは違う人が
好き勝手に言い出す時点で
設計とは違う話になってる

もう、独り言の世界
0497NAME IS NULL
垢版 |
2023/08/10(木) 12:34:15.09ID:???
最初に与えられた要件を絶対視する文化で育った人なのかな
実際に要件定義や設計をやればそれが以下に無駄かわかるようになるよ
0498NAME IS NULL
垢版 |
2023/08/10(木) 12:44:56.71ID:???
>>489に書いてるような変換機能はほぼ必須だから
要件として提示されてなくても考えるのは当たり前だよね
0499NAME IS NULL
垢版 |
2023/08/10(木) 12:51:05.34ID:???
書いてないものを作る名人
0500NAME IS NULL
垢版 |
2023/08/10(木) 13:21:07.54ID:???
>>496
設計を語れないなら黙ってろよw
当初質問した人なんてもう反応もしないわけで今はなしてる話題なんて完全に延長戦みたいなもんだろ
それと設計する以上はある程度の要件がある前提の話でそれもなくて>>371みたいにカラムの持ち方だけの質問なんて
正確な答えなんてでるわけないわ
・開始日、終了日というカラムが存在するテーブルがある
・「期間指定なし」を実現したい
A:期間指定なし用のカラムを追加する(is_unlimitedが1なら無制限になるとか)
B:開始日・終了日のカラムを「0000-00-00」(またはNULL)にする
こんな質問考える必要ないならルールに従えばいいだけ。ルールがないならどっちでも可能だから好きにしろで終わりだろ
0501NAME IS NULL
垢版 |
2023/08/10(木) 15:02:15.16ID:???
それは設計ではなく独り言って言うんだよ
0503NAME IS NULL
垢版 |
2023/08/10(木) 17:53:37.50ID:???
具体的な話もだせないでケチつける雑魚がいるスレはここですか?
0504NAME IS NULL
垢版 |
2023/08/10(木) 17:56:25.67ID:???
オレの妄想にケチ付ける奴は雑魚だ!
0505NAME IS NULL
垢版 |
2023/08/10(木) 23:50:07.03ID:???
>>500
お前は何にでも批判したいだけじゃん
自分の意見を出すのが怖い臆病者だ
だから他人の意見を否定するしか能がない
終わってるのはお前だよ
0506NAME IS NULL
垢版 |
2023/08/11(金) 01:17:57.14ID:izBijMIW
スレッドの目的が機能し始めたのに、データモデリングすらわからない人間がこのスレッドの書き込みを気に入らなくて批判しているのだろう。
0507NAME IS NULL
垢版 |
2023/08/11(金) 01:22:45.90ID:izBijMIW
>>500
カラム値がNULLのときの状況を説明するドキュメントが必要な設計を思いつくのは、ER図やテーブル定義書すら書かないレベルのやつの発想だからな。

カラムすべてに何かしらの値が設定されていないといけないという冷静に考えればおかしなことに気づかないのは、ドキュメンテーションをしないからだ。
0508NAME IS NULL
垢版 |
2023/08/11(金) 10:39:03.56ID:???
>>507
センティネル値でもドキュメントに説明が必要なのは同じやぞ
書いたことないのかな?
0509NAME IS NULL
垢版 |
2023/08/11(金) 12:12:29.44ID:izBijMIW
「NULLのときは○○」なんて書いても、このドキュメントを見ないとわからないクソ設計という意味なんだが?
0510NAME IS NULL
垢版 |
2023/08/11(金) 12:20:23.15ID:???
適当な日付入れて、それが未設定の意味だとする方がドキュメント必要だぞ
0511NAME IS NULL
垢版 |
2023/08/11(金) 13:06:47.84ID:???
0000-00-00を実際の開始日付だと思うわけ無いじゃん
実務経験ゼロかよ
0512NAME IS NULL
垢版 |
2023/08/11(金) 13:24:00.36ID:???
バグだと思われるだけ
0513NAME IS NULL
垢版 |
2023/08/11(金) 13:36:14.17ID:???
通常の日付じゃないことはわかったとして、それが何かの意味を持った値なのか、どういう意味なのかは
説明しないとわからんと思うぞ。もちろんNULLもだけど。
0514NAME IS NULL
垢版 |
2023/08/11(金) 13:44:29.97ID:???
ドキュメント作ったことのない請負かな?
0515NAME IS NULL
垢版 |
2023/08/11(金) 14:39:30.52ID:???
>>509
日本語能力が致命的に低いからドキュメント書いちゃダメなやつだね
0516NAME IS NULL
垢版 |
2023/08/11(金) 14:42:36.34ID:???
>>511
実務経験が少しでもあれば絶対に0000-00-00なんていう日付は選ばないんだがw
マジかよ
0517NAME IS NULL
垢版 |
2023/08/11(金) 15:28:48.80ID:???
あるスカラーフィールドにそのフィールドの型の定義域に含まれない意味を持った値を格納する方法は
いまの標準SQLの範囲には無いから絶対にこうだという解はない。
いくつか案は考えられるからプロコン挙げてその案件に合った案を選ぶのがふつう。
0518NAME IS NULL
垢版 |
2023/08/11(金) 15:33:53.23ID:???
文字型じゃないとはいらなくね?
0519NAME IS NULL
垢版 |
2023/08/11(金) 15:45:09.62ID:???
NULLはどの言語でもどのDBMSでも同じものがサポートされてるけど
9999-12-31のような固定値は使う言語やDBMSによってどの値を選択するか変わってくる上に
アーキテクチャによってアプリ層/DB層での定数管理方法なんかも変わってくるので
その辺りを総合的に考慮する必要が出てくる
特にDBMSの移行時にデータ型の変更だけでなくデータ自体を更新する必要があると結構めんどくさい

NULLのほうがバグるリスクとバグったときにクリティカルな問題につながるリスクが格段に高いんだけど
その辺りのリスクが許容できる程度に低い状況ならNULLも十分現実的な選択肢
NULLの考慮が必要なデータアクセスロジックが複数のアプリに分散するような仕組みなら辞めといたほうが無難
0520NAME IS NULL
垢版 |
2023/08/11(金) 21:08:38.63ID:???
さすがにそんな前提まで持ち出すのは無理がないか?
普通なら自分がいつも使ってるDBを前提とするか、依頼する側からDBを指定してくるだろ
話をこじらせようとしか思えないわ

それと移行するとした場合にしてもデータの解析ぐらいはするだろうし、
移行元が9999-12-31が入ってて、移行先が使えないなら別の値にすりゃいいだけだし、
プログラムにも手を入れるにしても普通なら9999-12-31の定数ぐらいは宣言してるだろうからそれを変更すればいいだけじゃね

ここにはNULL支持派とNULL否定派がいるから結局この話題については両者が納得できる落としどころなんてないだろうな
0522NAME IS NULL
垢版 |
2023/08/11(金) 21:19:57.30ID:???
>ここにはNULL支持派とNULL否定派がいるから

常にそのどちらかでなければならないと考えている人ばkりじゃあるまい。
0523NAME IS NULL
垢版 |
2023/08/11(金) 22:06:52.55ID:???
今現在の自分が持ってる狭い視野と物差しだけでしか物事を見れない人はDB設計には不向き
0524NAME IS NULL
垢版 |
2023/08/11(金) 22:18:42.98ID:???
お客 「もうお前は来なくて良い」
0525NAME IS NULL
垢版 |
2023/08/12(土) 00:53:30.73ID:???
>NULLのほうがバグるリスクとバグったときにクリティカルな問題につながるリスクが格段に高い
まずこれをきちんと立証してから言ってくれ
0527NAME IS NULL
垢版 |
2023/08/12(土) 09:34:29.64ID:???
頭を切開して妄想を取り出して見せて
0528NAME IS NULL
垢版 |
2023/08/12(土) 11:54:13.68ID:???
基本的に適用期間を使うとしたら
「ある基準日(例 2023/8/12)で使用する情報を取得する」みたいな感じだと思うがNULL不可であれば
適用開始日≦基準日 and 基準日≦適用終了日
の様な感じで実装できるけどNULL可能だと条件が増えるからそういう意味ではリスクが高くなるんじゃね
仮に基準日範囲だとさらに複雑になるわけだしな
>クリティカルな問題
これはどっちもどっちだと思うから言い過ぎだと思う
0529NAME IS NULL
垢版 |
2023/08/12(土) 12:25:01.98ID:???
範囲選択する様なSQLだと、最初からNULLを除外してくれます
考慮する必要が無くなるんだから、条件は増えないでしょう
0530NAME IS NULL
垢版 |
2023/08/12(土) 12:41:47.57ID:???
>>529
除外されたら困るからこそ考慮する必要があるんですけどね
0531NAME IS NULL
垢版 |
2023/08/12(土) 13:15:03.95ID:???
何も困らない。なんで困るの?
0532NAME IS NULL
垢版 |
2023/08/12(土) 14:35:46.95ID:???
こういう開発者がいるのがNULLのほうがバグるリスクが高い理由の一つ
0533NAME IS NULL
垢版 |
2023/08/12(土) 15:06:09.99ID:???
自分の出すバグを人のせいにする奴っているよね
0534NAME IS NULL
垢版 |
2023/08/12(土) 15:33:58.72ID:???
>>528
>>クリティカルな問題
>これはどっちもどっちだと思うから言い過ぎだと思う

データ取得時のバグはNULLのハンドリング忘れやハンドリング間違いによって起きる
結果として該当データが存在するにもかかわらずデータが取得されない状況やその逆が発生する
キャンペーン管理で使ってれば大々的に宣伝した割引価格が適用されないといった問題につながる
9999-12-31のような固定値のハンドリング忘れでは同じような問題は発生しない

データ更新時のバグはNULLが入るべきではない状況でNULLが入ったり
NULLが入るべき状況でNULL以外の値が入ることになるんだが
これは9999-12-31のような固定値でも引き起こす問題の種類は同じ
0535NAME IS NULL
垢版 |
2023/08/12(土) 15:49:38.03ID:???
NULLのデータは、そもそも該当データではないんだよ
NULLでも該当するパターンって一体何?
0536NAME IS NULL
垢版 |
2023/08/12(土) 16:08:57.93ID:???
例えば適用日が下記の様なデータがあったとする
NULL〜2022/12/31
2023/1/1〜2023/12/31
2024/1/1〜NULL
基準日がそれぞれ@2022/10/1、A2023/10/1、B2024/10/1だった場合に@とBは条件にNULLを考慮しないととれなくないか?
同じく基準日範囲が2022/12/1〜2023/3/31に含まれるデータを取得とかだと同じく面倒じゃねと思うんだが
まあ実際にこういう事を想定したデータを扱ったことがないから簡単に考えてるんだと思うが実際に実装させるとテストも含めてかなりめんどくさいと思うけどな
0537NAME IS NULL
垢版 |
2023/08/12(土) 16:27:06.65ID:???
常識で考えれば、範囲指定する選択の場合は、NULLは除外するだろう
0538NAME IS NULL
垢版 |
2023/08/12(土) 16:59:47.20ID:???
ECサイトのDBで商品マスタの価格が税込み価格しかないって危険すぎないですか??
税込み金額から除算で税抜金額出すのって誤差出ますよね?
0539NAME IS NULL
垢版 |
2023/08/12(土) 17:20:08.25ID:???
税率が変わることもあるので、税込みにしてしまうと更新が大変だな
0540NAME IS NULL
垢版 |
2023/08/12(土) 22:08:56.11ID:???
>>538
誤差というか端数処理は消費税計算において必ず発生するものだから決められたルールに沿って処理するだけ
総額表示義務対象でユーザーに見える販売価格を管理するためのマスターってことなら
税込価格だけ持って税抜価格は計算で行うという方法でもそんなにおかしくない
0541NAME IS NULL
垢版 |
2023/08/12(土) 23:12:35.74ID:???
いやおかしい
決められたロジックで出すからこそ税込処理はアプリ側でさせるべき
0542NAME IS NULL
垢版 |
2023/08/13(日) 00:08:17.95ID:???
マスタに税込価格と税抜価格を持っていたとしてもその差分が
客からもらう税金と必ずしも一致するわけじゃないから税金計算処理は必ずアプリロジックが入る
その処理が税込価格からの計算なのか税抜価格からの計算なのかという違いがあるだけ
0543NAME IS NULL
垢版 |
2023/08/13(日) 00:09:58.09ID:???
税率が変わる事も想定した方が良いぞ
0544NAME IS NULL
垢版 |
2023/08/13(日) 00:10:48.14ID:???
ガソリンスタンドとか商品マスタに税抜価格だけ持ってて税金計算を毎回アプリ側でやってると思う?

スーパーでもバーコードを通して参照する商品マスタの価格は税込価格で
それをベースに内税の算出をアプリ側でやるところも増えてる
Amazonとかもたぶんそうなんじゃないかな
0545NAME IS NULL
垢版 |
2023/08/13(日) 00:14:50.53ID:???
税率変わる毎にマスタ洗替するわけないだろ
0546NAME IS NULL
垢版 |
2023/08/13(日) 00:25:47.56ID:???
毎回手計算で税額出してると思う?
0547NAME IS NULL
垢版 |
2023/08/13(日) 00:34:23.99ID:???
>>545
洗い替えなんてしない
税率が変わるタイミングで税込価格も変更したければその日から有効になる新しい価格を設定するだけ
税率が変わっても税込価格を維持したければ新しい価格を設定する必要もない
0548NAME IS NULL
垢版 |
2023/08/13(日) 00:36:26.60ID:???
ガソリンの例でてるから、それ使うけど
給油量は毎回違うんだよ
0549NAME IS NULL
垢版 |
2023/08/13(日) 00:43:07.93ID:???
スーパーの例がでてるからそれ使うけど
何万何十万ものある商品を扱うマスターに
過渡的に使う価格をずっと保持するのか?
改訂後は二度と使わないレコードだぞ
0550NAME IS NULL
垢版 |
2023/08/13(日) 00:46:06.37ID:???
消費税上がる度に、マスターのカラムが増えてくるんだな

すごい設計だ
0551NAME IS NULL
垢版 |
2023/08/13(日) 00:54:21.02ID:???
>>548
何の話だよw

>>549
一般的にはずっとは保持しない
決められた保持期間をすぎれば古いものは整理する
店や商品によるけど一般的な小売ならだいたい3年は保持してる
改定後でも履歴の参照や分析用途に使う
0552NAME IS NULL
垢版 |
2023/08/13(日) 00:55:25.02ID:???
>>550
君の頭の中のエアー設計どうなってんだよw
興味ないけど
0553NAME IS NULL
垢版 |
2023/08/13(日) 00:58:51.86ID:???
消費税改定する度にマスターを更新しないといけない様な作り二はしません
0554NAME IS NULL
垢版 |
2023/08/13(日) 10:07:21.48ID:???
3年毎にマスターのテーブル設計が変わる
データ更新ではなく
飛んでもない設計だな

履歴は、既に変わらないデータなので、
購入した時点での価格をレコード内に保持していれば
過去の価格の参照は必要ない
0555NAME IS NULL
垢版 |
2023/08/13(日) 16:25:20.32ID:???
システムによって細かい違いはあるかもしれないが
うちが取り扱ってる販売管理は商品ごとに税込み税抜き非課税が選択できる
そのうえで消費税の計算を伝票毎に行うか、締め日にまとめて行うかも選択できる
0556NAME IS NULL
垢版 |
2023/08/13(日) 17:34:14.78ID:???
それは要件であって設計ではない
0557NAME IS NULL
垢版 |
2023/08/13(日) 18:57:21.07ID:???
負け惜しみコメントとかまってちゃんな素人コメントが多すぎ
0558NAME IS NULL
垢版 |
2023/08/13(日) 20:21:54.74ID:???
上流工程含めて一から設計する経験したことない奴ばかりなんでしょ
実際は誰かが書いた仕様書通りに作るだけの雑魚さんだと思われる
0559NAME IS NULL
垢版 |
2023/08/13(日) 20:32:03.76ID:???
仕様書通りに作れるならまだ良いんだが
どこからか俺様仕様書が出てきて、
発注者とけんか始めるからなあ
0560NAME IS NULL
垢版 |
2023/08/14(月) 00:48:49.68ID:???
素人丸出しなのになぜもう少し謙虚になれないのか
自分でも分かってるでしょ
レスを投稿する


ニューススポーツなんでも実況