DB設計を語るスレ 11
>>455
理論に詳しくないかどうかは議論してみれば明らかになると思うが、そもそも
「そいつ」がどう理論に詳しくないのかどの発言で分かったんだろう? >>459
判ってるから、誰も教えてあげないんだろう→わかる
実務やってるならわかるはずだから教えない→??? >>457
大筋同意なんだが、NULLに運用上意味をもたせることが安全かというと、
未定・不明値には別途定義したカテゴリ値を与える方が誤解が生じにくいのも確か そこまでいくと、それはサイトのポリシーとか宗教的信念の世界になりそう そもそもNULLという設定項目があるんだから、意味はあるだろ 不存在のNULLは自然だが、それ以外の何らかの値としての意味を持たせようとすると
=NULL の扱いが面倒だな。 つまるところ、不存在は未定あるいは不明値なのかって話 少なくともいまのSQLでは、他の有効な値と同列な「不明値」という一つの値として扱うことはできない。
そのうえで不存在か不明値か未設定かどう解釈するかというのは、振る舞いが同じならどう解釈しようと自由。 今のSQLって具体的になんという名前のSQLですか? NULLは値が存在しないことを示すマーカー
なぜ値が存在しないのかという理由が大きく分けて2種類あって
それが「not applicable」と「unknown at present」
(コッドの言うI-ValuesとA-Values)
前者は>>463の言うように何かしらのカテゴリ値と一緒に使われることが多い
その場合はカラム間の依存性ができるので更新対象なら不整合が発生しないような考慮が必要
場合によってはサブタイピングでテーブル分割される
後者は単独で使われるほうが一般的
FKがNULLの場合なんかが一番わかりやすい
終了日をNULLにするのも一般的にはこっちのケース >>470
SQL86以降の標準SQL一般の話。ベンダ拡張なんかは考慮してないが。
調べてみたら今はSQL:2023まであるんだな。
ちょうど、UNIQUEにNULLが含まれる場合の振る舞いを指定できる仕様が追加されたらしい。
http://peter.eisentraut.org/blog/2023/04/04/sql-2023-is-finished-here-is-whats-new =NULLを認めていればこんな役に立たない議論しなくて済んだのに
3値論理自体が無用の長物 これは議論ではないと思います
会話にすらなっていません 確かに。文脈を理解して回答を出すというより、単語に反応して関係ない意見表明をしてるだけでChatGPT以下 要はNUMBERやVARCHARといった型の定義域の外の値が1個使えたらいいのにって話だな。それにNULLを充てれば、と。
でもそれが1個ならいいけどそうとも限らんしな。 >>473
CUIの時代だと空を見た目で表現するのが難しい。
いまでも文字列として「NULL」とか「(NULL)」という列値を設定するプログラマがいる。
値が設定されていないことをチェックする構文を常に書かないといけないことになったら、そっちの方が面倒なことになる。 実際の現場って形通りやってないと思う
多少アンチパターンでも動くのを優先してるかと 上でも書いたけど適用日がたんなる参照項目ならnullでも構わないけど
範囲指定なんかにも使われる場合、コードの実装時に面倒だからそういう事があるならnullで持たないほうがいいと思うけどな 範囲指定する場合は、そもそも検索対象から外されているだろう 開始日と終了日が無限小/無限大のケースがあるならそれをNULLで表現すると
範囲検索のクエリがやや複雑になるね。 出題者からそういう依頼は出ていないので考えなくて良い バグったときのリスクを考えるとNULLよりもセンティネル値のほうがベターだとは思うが
SQL2011のapplication time periods機能でNULLがunboundとして扱われるDBMSもあるのでその場合はNULLで十分だと思う 設計を語るスレなのに、IS NULL検索が頻発する設計がいいらしいw NULLを使っていてもIS NULL検索が不要になるんだよ 質問者がNULLが嫌だと言い始めたのがこの話題なんだが? 開始日がNULLかどうか調べないと、データの状態がわからないというデータモデルが好きらしいから、勝手にやればいいんじゃない。 別にNUKKが嫌だとは言ってないだろう
選択肢として色々言ってるだけだ 自分が設計する際は条件指定される項目にNULLは許してないけどそれを許可する人もいるだろうぐらいの認識だわ
かりに今回みたいな適用期間をNULL不可にした場合は暫定的な日付を入れることになるから
登録・更新時や画面に表示する際に考慮が必要だけど
少なくとも検索にNULLを考慮した条件を記載するよりは不具合も起きにくいと思ってる
登録更新時にNULLを何らかの日付に変換し忘れ→SQLエラーになる
画面表示時に日付をNULLに変換し忘れ→変な日付がでる なんで条件を勝手に付け加えるんだろう
その方が不思議でならない >登録更新時にNULLを何らかの日付に変換し忘れ
とは言ってる 489書いたの俺だけど入力し忘れではなく
画面適用日の開始や終了が空欄(日付指定なし)の場合はDB上は1900-01-01や2999-12-31といった値に置き換えて更新
画面表示の際は1900-01-01や2999-12-31の場合は空欄にするって意味だったけど伝わらなかったみたいだね
すまんね >>491
要件が不十分だからでしょ
要件が不十分だったり不明瞭なら
ある程度までは前提を追加して案を考えるのが設計というもの いや、要件を依頼者とは違う人が
好き勝手に言い出す時点で
設計とは違う話になってる
もう、独り言の世界 最初に与えられた要件を絶対視する文化で育った人なのかな
実際に要件定義や設計をやればそれが以下に無駄かわかるようになるよ >>489に書いてるような変換機能はほぼ必須だから
要件として提示されてなくても考えるのは当たり前だよね >>496
設計を語れないなら黙ってろよw
当初質問した人なんてもう反応もしないわけで今はなしてる話題なんて完全に延長戦みたいなもんだろ
それと設計する以上はある程度の要件がある前提の話でそれもなくて>>371みたいにカラムの持ち方だけの質問なんて
正確な答えなんてでるわけないわ
・開始日、終了日というカラムが存在するテーブルがある
・「期間指定なし」を実現したい
A:期間指定なし用のカラムを追加する(is_unlimitedが1なら無制限になるとか)
B:開始日・終了日のカラムを「0000-00-00」(またはNULL)にする
こんな質問考える必要ないならルールに従えばいいだけ。ルールがないならどっちでも可能だから好きにしろで終わりだろ 具体的な話もだせないでケチつける雑魚がいるスレはここですか? >>500
お前は何にでも批判したいだけじゃん
自分の意見を出すのが怖い臆病者だ
だから他人の意見を否定するしか能がない
終わってるのはお前だよ スレッドの目的が機能し始めたのに、データモデリングすらわからない人間がこのスレッドの書き込みを気に入らなくて批判しているのだろう。 >>500
カラム値がNULLのときの状況を説明するドキュメントが必要な設計を思いつくのは、ER図やテーブル定義書すら書かないレベルのやつの発想だからな。
カラムすべてに何かしらの値が設定されていないといけないという冷静に考えればおかしなことに気づかないのは、ドキュメンテーションをしないからだ。 >>507
センティネル値でもドキュメントに説明が必要なのは同じやぞ
書いたことないのかな? 「NULLのときは○○」なんて書いても、このドキュメントを見ないとわからないクソ設計という意味なんだが? 適当な日付入れて、それが未設定の意味だとする方がドキュメント必要だぞ 0000-00-00を実際の開始日付だと思うわけ無いじゃん
実務経験ゼロかよ 通常の日付じゃないことはわかったとして、それが何かの意味を持った値なのか、どういう意味なのかは
説明しないとわからんと思うぞ。もちろんNULLもだけど。 >>509
日本語能力が致命的に低いからドキュメント書いちゃダメなやつだね >>511
実務経験が少しでもあれば絶対に0000-00-00なんていう日付は選ばないんだがw
マジかよ あるスカラーフィールドにそのフィールドの型の定義域に含まれない意味を持った値を格納する方法は
いまの標準SQLの範囲には無いから絶対にこうだという解はない。
いくつか案は考えられるからプロコン挙げてその案件に合った案を選ぶのがふつう。 NULLはどの言語でもどのDBMSでも同じものがサポートされてるけど
9999-12-31のような固定値は使う言語やDBMSによってどの値を選択するか変わってくる上に
アーキテクチャによってアプリ層/DB層での定数管理方法なんかも変わってくるので
その辺りを総合的に考慮する必要が出てくる
特にDBMSの移行時にデータ型の変更だけでなくデータ自体を更新する必要があると結構めんどくさい
NULLのほうがバグるリスクとバグったときにクリティカルな問題につながるリスクが格段に高いんだけど
その辺りのリスクが許容できる程度に低い状況ならNULLも十分現実的な選択肢
NULLの考慮が必要なデータアクセスロジックが複数のアプリに分散するような仕組みなら辞めといたほうが無難 さすがにそんな前提まで持ち出すのは無理がないか?
普通なら自分がいつも使ってるDBを前提とするか、依頼する側からDBを指定してくるだろ
話をこじらせようとしか思えないわ
それと移行するとした場合にしてもデータの解析ぐらいはするだろうし、
移行元が9999-12-31が入ってて、移行先が使えないなら別の値にすりゃいいだけだし、
プログラムにも手を入れるにしても普通なら9999-12-31の定数ぐらいは宣言してるだろうからそれを変更すればいいだけじゃね
ここにはNULL支持派とNULL否定派がいるから結局この話題については両者が納得できる落としどころなんてないだろうな >ここにはNULL支持派とNULL否定派がいるから
常にそのどちらかでなければならないと考えている人ばkりじゃあるまい。 今現在の自分が持ってる狭い視野と物差しだけでしか物事を見れない人はDB設計には不向き >NULLのほうがバグるリスクとバグったときにクリティカルな問題につながるリスクが格段に高い
まずこれをきちんと立証してから言ってくれ 基本的に適用期間を使うとしたら
「ある基準日(例 2023/8/12)で使用する情報を取得する」みたいな感じだと思うがNULL不可であれば
適用開始日≦基準日 and 基準日≦適用終了日
の様な感じで実装できるけどNULL可能だと条件が増えるからそういう意味ではリスクが高くなるんじゃね
仮に基準日範囲だとさらに複雑になるわけだしな
>クリティカルな問題
これはどっちもどっちだと思うから言い過ぎだと思う 範囲選択する様なSQLだと、最初からNULLを除外してくれます
考慮する必要が無くなるんだから、条件は増えないでしょう >>529
除外されたら困るからこそ考慮する必要があるんですけどね こういう開発者がいるのがNULLのほうがバグるリスクが高い理由の一つ >>528
>>クリティカルな問題
>これはどっちもどっちだと思うから言い過ぎだと思う
データ取得時のバグはNULLのハンドリング忘れやハンドリング間違いによって起きる
結果として該当データが存在するにもかかわらずデータが取得されない状況やその逆が発生する
キャンペーン管理で使ってれば大々的に宣伝した割引価格が適用されないといった問題につながる
9999-12-31のような固定値のハンドリング忘れでは同じような問題は発生しない
データ更新時のバグはNULLが入るべきではない状況でNULLが入ったり
NULLが入るべき状況でNULL以外の値が入ることになるんだが
これは9999-12-31のような固定値でも引き起こす問題の種類は同じ NULLのデータは、そもそも該当データではないんだよ
NULLでも該当するパターンって一体何? 例えば適用日が下記の様なデータがあったとする
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に含まれるデータを取得とかだと同じく面倒じゃねと思うんだが
まあ実際にこういう事を想定したデータを扱ったことがないから簡単に考えてるんだと思うが実際に実装させるとテストも含めてかなりめんどくさいと思うけどな 常識で考えれば、範囲指定する選択の場合は、NULLは除外するだろう ECサイトのDBで商品マスタの価格が税込み価格しかないって危険すぎないですか??
税込み金額から除算で税抜金額出すのって誤差出ますよね? 税率が変わることもあるので、税込みにしてしまうと更新が大変だな >>538
誤差というか端数処理は消費税計算において必ず発生するものだから決められたルールに沿って処理するだけ
総額表示義務対象でユーザーに見える販売価格を管理するためのマスターってことなら
税込価格だけ持って税抜価格は計算で行うという方法でもそんなにおかしくない いやおかしい
決められたロジックで出すからこそ税込処理はアプリ側でさせるべき マスタに税込価格と税抜価格を持っていたとしてもその差分が
客からもらう税金と必ずしも一致するわけじゃないから税金計算処理は必ずアプリロジックが入る
その処理が税込価格からの計算なのか税抜価格からの計算なのかという違いがあるだけ ガソリンスタンドとか商品マスタに税抜価格だけ持ってて税金計算を毎回アプリ側でやってると思う?
スーパーでもバーコードを通して参照する商品マスタの価格は税込価格で
それをベースに内税の算出をアプリ側でやるところも増えてる
Amazonとかもたぶんそうなんじゃないかな >>545
洗い替えなんてしない
税率が変わるタイミングで税込価格も変更したければその日から有効になる新しい価格を設定するだけ
税率が変わっても税込価格を維持したければ新しい価格を設定する必要もない ガソリンの例でてるから、それ使うけど
給油量は毎回違うんだよ スーパーの例がでてるからそれ使うけど
何万何十万ものある商品を扱うマスターに
過渡的に使う価格をずっと保持するのか?
改訂後は二度と使わないレコードだぞ 消費税上がる度に、マスターのカラムが増えてくるんだな
すごい設計だ >>548
何の話だよw
>>549
一般的にはずっとは保持しない
決められた保持期間をすぎれば古いものは整理する
店や商品によるけど一般的な小売ならだいたい3年は保持してる
改定後でも履歴の参照や分析用途に使う >>550
君の頭の中のエアー設計どうなってんだよw
興味ないけど 消費税改定する度にマスターを更新しないといけない様な作り二はしません 3年毎にマスターのテーブル設計が変わる
データ更新ではなく
飛んでもない設計だな
履歴は、既に変わらないデータなので、
購入した時点での価格をレコード内に保持していれば
過去の価格の参照は必要ない システムによって細かい違いはあるかもしれないが
うちが取り扱ってる販売管理は商品ごとに税込み税抜き非課税が選択できる
そのうえで消費税の計算を伝票毎に行うか、締め日にまとめて行うかも選択できる 負け惜しみコメントとかまってちゃんな素人コメントが多すぎ 上流工程含めて一から設計する経験したことない奴ばかりなんでしょ
実際は誰かが書いた仕様書通りに作るだけの雑魚さんだと思われる 仕様書通りに作れるならまだ良いんだが
どこからか俺様仕様書が出てきて、
発注者とけんか始めるからなあ 素人丸出しなのになぜもう少し謙虚になれないのか
自分でも分かってるでしょ