コンセプト:
・見積作業を簡潔に
・見積内容のDB化
見積書システム機能:
Python,Djangoを使った見積書登録Webアプリ
・ユーザーの登録
・ログイン
・ログインユーザーでの見積書の登録、参照(一覧と詳細)、更新、削除
→見積書には載せない項目も含めています
・顧客情報の登録、参照、更新、削除
・見積書をexcelとして出力
・DBバックアップ機能
(のちの発展では・・・)
・見積機能に付随して仕入見積依頼、受注、売上処理など 受発注システムの統合、一元化
・画像ファイルなどのバイナリファイルアップロード機能
・ログインユーザーによる承認機能
RDBMS:PostgreSQL
現状の不明点:
・備考の項目が見積書テーブルと顧客テーブルにそれぞれ用意しており、それぞれ異なる備考項目を設定している。
カラム名にテーブル名が含まれているのはよくないとの見解もあるが、それぞれのカラムの役割を明確にするため必要なのでは?
テーブル設計を始めて行ってみましたが、経験豊富な方の意見を頂きたく存じます。
・正規化ほか設計のなんたるかがわかっていない!
・命名がなっていない!
・ER図すら書けていない!
・保守性、発展性、わかりやすさ、パフォーマンス の向上のために設計はこうしたほうがいい!
などご指摘を頂けますと幸いです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/14 08:57 編集
回答3件
0
#長文過ぎて他の回答は確認せずに回答してますので、重複するような部分があると思いますのでご容赦
ぱっと見で、質問にあるテーブルはまだまだこなれていない印象です。
例えば、
見積書テーブル:
顧客とユーザーの組み合わせが一意キーになっているが、それでは、同じ組み合わせでの別な見積もりが登録できない。
見積詳細テーブル:
納期は見積書テーブルにあるべきだと思う。
なので、もっと精度を上げるべきです。
方法としては、実際に使用された見積書のサンプルを入手して、そのデータを設計したテーブルに落とし込み精査する事を繰り返すと良いと思います。
サンプルからイレギュラーなケースを見つけ出す事が出来る程度に数をこなした方がいいでしょうね。
投稿2020/07/15 01:17
総合スコア25327
0
ベストアンサー
誤操作でバタバタしてしまい申し訳ございません、あらためて回答をさせていただきます
ExcelをDB化するのは柔軟な検索、集計がやりやすいというメリットがあります
(そもそもExcelを「DB化」とは言わない)
社内ローカルのWeb業務システムは無数に稼働してますし普通だと思いますよ。
他にもマスタとデータを分けたりリレーションで情報を取ってくることにより情報の重複を防げたりするのでその辺も踏まえて自分なりにざっと見てみました
ただし、要件を全て把握してるわけではないのと、
自分だったらこうするというだけで宗教的思想も大いに混じっていますのでいろいろな意見を取り入れるのがいいと思います
カラム名について
質問本文にもあるテーブル名が含まれている件
これについては例えば備考なら「remark」だけでいいと思います
clientsテーブルにあるremarkカラムなら顧客についての備考と明白なためです
同様に「client_id」「client_name」なども「id」「name」でいいのではないでしょうか
一方「qty」「attn」などはわかりにくいので略さない方がいいと思います。
また、日付系が「~_at」という名前にされていますが文章じみた名称になってるのが気になるので、自分なら「~_date」(日付までの場合)、「~_datetime」(時分秒まである場合)にします。
見積書テーブルの「バージョン情報」
↑の質問回答に「項目としてある以上は」となっているということは、元となるExcelにあった情報ということでしょうか?
個人的には(これだけの情報なら)不要かなと思いました。
検索時に「最新のモノを選ぶ」というひと手間が余計にかかりますし
契約文書等なら過去バージョンを残していくのもいいですが、自分がこのシステムを作るなら、更新時にいつだれがどこを変えた、というのを残すログテーブルを追加すると思います
見積書テーブルの「更新日時」
自分であればここは最初は登録日時と同じ値を入れておきます。
個人的にnull許容の列はできるだけ作りたくないというのがあるので……
見積書詳細テーブルの「商品名」「商品詳細」
これは商品マスターテーブルを作成してそこへの外部キーで対応した方がいいのではないでしょうか?
見積書詳細テーブルの「納期」
テキストによるこの持ち方だと、例えば「納期が迫ってるけど未納状態のモノ」などの検索機能を作るときにやりづらいので、日付型にして明記しておいた方がいいのかな? と考えます
見積書テーブルの「小計金額」
これは仕様によって悩むところではあるんですが……
ここにこの情報があると、見積書詳細テーブル側にある売上単価が変わった時にこちらも再計算して更新しなければなりません。何かのミスで片方が更新されなかった場合などにトラブルを生みます。ので、可能であればこのテーブルから情報は無くし、見積書詳細テーブルから計算して出力した方がいいと思います。
見積書テーブルの画像データなど
没案の方に書かれていますが、これは別テーブルにして保持すれば見積書テーブルそのものは重くならずに、また複数のファイルを添付情報にすることも可能になります。
ユーザーテーブル
他の方も言われていますが、ActiveDirectory環境があるならユーザ情報はそちらとの連携を検討するのもいいと思います。
またそういった環境がなくとも社員番号のような一意の情報が各ユーザにあるならそれをIDにするのがいいと思います(苗字をIDにすると苗字被り、イニシャル被りでどんどんグダっていく)
見積書テーブルの主キー
文字列で定義されていますが、これは運用に従い増えていくものなので、自分であればオートインクリメントの数値型にするかなといったところです。
見積書詳細テーブルの主キー
これも同様にオートインクリメントの数値型カラムを作ってそれを主キーにし、見積書IDを外部キーとして使用します。
ユーザーテーブル、顧客テーブルに「有効フラグ」列
ユーザーが退社したためそのIDではログインさせたくない、ある顧客との付き合いがなくなったため選択肢に出したくない、などの時に、ユーザーテーブルや顧客テーブルなどのマスタテーブルから情報を消してしまうと、見積書テーブルなどのデータテーブルの外部キーから情報を引っ張ってこれなくなくなってしまいます。
なのでマスタ系のテーブルには「有効」「無効」を表すカラムを追加してtrueかfalseかで切り分けるようにするのがいいと思います。(いわゆる論理削除。商品マスタを作成するのであればそれにも)
ざっと見た感じですが、自分の好みに合わせるとしたらとりあえずこんな感じでしょうか?
もちろんこれは「今ある情報から見える自分が好きなやり方」なので環境上、また運用上そうは出来ないこともあると思いますし、他の方が見れば他にも多々案があると思います。
(追記 null許容云々について)
nullはいろいろと複雑さをDBに持ち込みます。
有名なのは3値論理問題ですが SQLの真偽値はtrue、falseの他にunknownという値が存在します。
これはnullが絡んだときに出てきます。
例えば見積書詳細テーブルの商品名がそれぞれ「カレー」「ハヤシ」「null」の3データがあったとして
商品名 <> 'カレー'
とWHERE句に指定すると結果は「ハヤシ」の1行しか返ってきません。
これはnullとの比較結果がunknownになっていてtrueではないためです
このようにまず考えることが増えます。
またnullと算術計算した結果はnullになってしまいます(nullは伝染する)
ソートにも問題があり、nullが最小値と判断されるか最大値と判断されるかはDBソフトにより異なります
DBソフトのリプレースをするときに発火するかもしれないです
プログラム側にも影響があります
null許容型の列から出てきた値は常にnullかもしれないと考えて処理しなければいけませんし、
INSERT時にバグで値が渡されていない列があった場合を考えるとnull許容でなければ少なくともSQLエラーでミスは発覚しますがnull許容だとそのまま動き続けてしまいます
(しっかりテストすればいい説もありますが現実にはいろいろと…)
等々、いろいろな理由でnullが入るのは忌避される傾向があります(のはずです)
なので私は備考などもなかったとしてもnullではなく空白文字を入れておくようにしていますし、マスタからの選択の場合も「0:未定」のようなものを入れておくようにしています。
ネット上にもいろいろな文献があるので
「RDBMS null」「3値論理」などで検索してみるといろいろ出てくると思います。
もちろんnullは完全になくせ! とは主張しません。
必要な場合もあります。 「完了日」などを作るなら完了するまではそれはnullだと思います。
これは「未知」のnullです。
調べてみると出てくると思いますがnullには「未知」と「適用不能」の2種があり、「適用不能」のnullが多いテーブルは1つのテーブルにまとめるべきでないものをまとめていないか?
と考えますね。
投稿2020/07/14 04:41
編集2020/07/15 00:05総合スコア610
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/14 15:10 編集
2020/07/15 00:06
2020/07/15 13:44 編集
0
非推奨の質問に見えますが、アドバイスをとのことなのでアドバイスだけ。
user_idが主キーですが、もしログインIDとして使ったり、自動発番されないのなら、システムが自動的に割り当てる値を主キーにした方が拡張性が高いと思います。
また、E-R図を作る前に業務フロー図を作った方が良いと思うのですが、どうやってこのシステムを運用するか決まっていますか?
決まっていないなら前提が変わるのでE-R図云々の前にそちらを作成した方が良いです。
・見積作業を簡潔に
・見積内容のDB化
とあますが、どちらが優先ですか?
DB化ならExcelとかSpreadSheetで作っても良さそうです。
簡潔にならこれもExcelやSpreadSheetで作っても達成できそうです。
なぜWebアプリなのですか?
業務利用PC上で動くアプリを作った方がユーザの操作が簡単なのでは?
・ユーザーの登録
・ログイン
「見積もり」という話なので、勝手に会社だと思って書きますが、すでにAD等で管理されていませんか?
二重管理になると、整合性を担保したりするのが難しそうですが、誰がメンテナンスするのでしょうか?
とりあえず要求をまとめた方がよろしいかと思います。
投稿2020/07/14 02:11
総合スコア2424
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/14 03:08
2020/07/14 04:24
2020/07/15 13:16
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。