🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
MySQL

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

SQLAlchemy

SQLAlchemyとはPython 用のORMライブラリです。MIT Licenceのオープンソースとして提供されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

5回答

4378閲覧

【DBの設計】動的にカラムを足すことは可能か

u.sayaka0112

総合スコア38

MySQL

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

SQLAlchemy

SQLAlchemyとはPython 用のORMライブラリです。MIT Licenceのオープンソースとして提供されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2019/10/01 08:25

編集2019/10/01 08:39

【やりたいこと】 下記のような画像の表をDB化したい。
図1
イメージ説明
図2
イメージ説明

【環境】

  • MySQL (8.0)
  • vue.js(2.9.6)
  • python(3.6.3)
  • SQLAlchemy
  • (DBはmodel.py を作成し、flask db migrate, flask db upgrade で管理、更新)

こんにちは!駆け出しエンジニアのものです。
やりたいこととして、図1の表をDBで扱えるようにしたいです。
3次元の情報を正規化するのは難しいと思うのでこのままテーブル化(発注テーブル)するのが良いかなと考えています。
ただ、以下の点を考慮する必要があります。

  • 新規店舗が増えた場合(G店,H店)、カラムを追加する必要がある

DBには店舗テーブルもあり、図2のフォームで新規登録できます。
この時、新規登録した際に発注テーブルに変更を加える必要があると考えており、想定している実装方法は下記の通りです。

  1. 新規登録ボタンを押すと同時に、model.py に新店舗のカラム追加のコードを加える
  2. flask db migrate, flask db upgrade を走らせる

もし、ベターな方法があるならばご教授いただきたいです。
また、不可能であるならば、お教え頂きたいです。

追記
最終的に図1の表をそのまま、csvファイルとしてエクスポートする必要があります。
そのためそのままテーブル化するのが簡単だと思ったのですが、それよりも
正規化をした上で、必要なデータを抽出しcsv化した方が良いでしょうか。

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

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

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

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

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

guest

回答5

0

ベストアンサー

3次元の情報を正規化するのは難しいと思うのでこのままテーブル化(発注テーブル)するのが良いかなと考えています。

よくありません。きちっと区切っていけば正規化できますし、同じ種類の情報を複数カラムに分けて入れると集計が困難になります。

投稿2019/10/01 08:28

maisumakun

総合スコア145967

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

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

maisumakun

2019/10/01 08:32

メインのテーブルは「商品コード、納品日、店舗ID、数量」のようにして、あとは商品リストのテーブル、店舗リストのテーブル、というように分けられるかと思います。
u.sayaka0112

2019/10/03 09:15

ありがとうございます。おっしゃる通りしっかり正規化し、openpyxlを使用しアウトプットするようにしました。
guest

0

稼働中にテーブルのレイアウトを変更するような事は普通しません。
列方向への拡張などは行わず、行方向へ拡張(要は追加)とします。

求める表はクロス集計とかピボットテーブルなどと呼ばれるもので、列方向が可変である場合には、MySQLなら動的SQLによってSQLを組み立てるような処理になるかと思います。

ただ動的よりも、列方向の上限を決め打ちした方が、良いかと思います。

クロス集計を行わないなら、json型で列挙したり、文字列型に編集して畳んでおくとか。

投稿2019/10/01 08:40

sazi

総合スコア25327

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

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

0

横に並べたテーブルを作るととってもメンテナンが大変になるので、MySQL GROUP_CONCAT関数 を使って横に並べます。

投稿2019/10/01 08:34

Orlofsky

総合スコア16417

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

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

0

  • 商品コード
  • 納品日
  • 店舗コード

ごとに1レコードで管理すれば良いでしょう

商品と店舗にはそれぞれ別途マスターテーブルを用意してください

投稿2019/10/01 08:32

yambejp

総合スコア116661

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

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

0

店舗ごとに列を持つのはテーブル設計としてイマイチだと思います
私としては「店舗コード」という列1つにして行を積んでいく方がいいと考えます。

投稿2019/10/01 08:31

q_sane_q

総合スコア610

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問