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

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

ただいまの
回答率

90.76%

  • Ruby on Rails

    6755questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • MySQL

    5529questions

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

  • SQL

    2233questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • PostgreSQL

    992questions

    PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

「NULL排除について」の質問について分からない点があったのでお聞きしたいです。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 202

tomuziso

score 17

https://teratail.com/questions/103726

こちらの「NULL排除について」の質問について拝見していました。
しかし書かれていることについて理解があまり進まず分からない点があったので質問致します。

質問者の現状のDB構成は以下だということは分かりました。
(Modelは回答者の例から店舗と置き換えています)

 DB

店舗(model)モデル

id prefecture_id city_id
1 1 1

都道府県(Prefecture)モデル

id prefecture ~~~
1 東京都 ~~

市区町村(City)モデル

id city ~~~
1 奥多摩町 ~~

都道府県中間

id model_id prefecture_id
1 1 1

市区町村中間

id model_id city_id
1 1 1

 質問点

 何故1対1の関係を使っているのか

質問者の質問によると

Modelと Prefecture Cityは一対一の関係です。

とあります。

しかしここで都道府県と市区町村というデータが保存されている、ということは
都道府県と店舗で言うと「1対多」と自分は感じましたが間違っているのでしょうか?
「「東京都」はたくさんの「店舗」を持てる」というように考えると1対1ではないような気がしました。

1対1ということは例えば「東京都」というレコードが複数存在する可能性があるということでしょうか?

 Unknownレコード追加とは?

回答者のmiyabi-sunさんから解決策が提案されています。

まずはPrefectureとCityのマスターテーブルに「見当たらなかった」用のUnknownレコードを追加しよう。

ここで言う「Unknownレコード」追加の解決法とは

  • 都道府県モデルで言うと、prefectureカラムにunknownというデータを挿入。
  • 店舗モデルで都道府県が表記ゆれ等で適切な外部キーが引けなかった場合は、挿入したunknownのidを外部キーとする(これで中間テーブルの存在は要らなくなる)

という認識で合ってるでしょうか?

 店舗モデルはどういった設計をイメージしているのか?

最後にこちらの質問者が作成しているDB設計についてです。

そもそもの設計として「店舗モデルに住所をCSVからインポートする」ということは、DBとしては

id address prefecture_id city_id
1 東京都足立区~~~ 1 1
2 東京都千代田区~~~ 1 2
3 とうきょと足立区~~~ 1 1

こういう設計になっているということでしょうか?
自分自身CSVからインポートするという経験がないのであまりイメージできていません。
CSVからインポートする際にprefectureやcityテーブルを参照して一致したら外部キーのidを書き込む、という方法なのでしょうか?

以上の3点がこちらの質問を拝見させていただいて分からない点でした。
どなたか教えて頂ける方いらっしゃいましたら教えていただきたいです。
よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

RoRから離れたデータベースの観点で、システムのDB構成を見ると
理解、そして誤解点の修正ができると思います。
なおRoR自体はあまり詳しくないので、その点はご理解ください。

 回答

「「東京都」はたくさんの「店舗」を持てる」というように考えると1対1ではない

この認識は正しくないです。現実に「店舗」は1つの住所しか持たないので、
1つの「都道府県」データと1つの「市区町村」データで
住所を示せます、1つですみます。
ですから「1対1」の関係なのです。

ですので

1対1ということは例えば「東京都」というレコードが複数存在する可能性があるということでしょうか?

とはなりません。
あくまで都道府県(Prefecture)モデルが主語であり、どういう項目を持つのかがポイントです。
都道府県(Prefecture)モデルはたくさんの「都道府県」データを持てるのです。
(実際には北海道から沖縄県までですが)
そして「東京都」は都道府県(Prefecture)モデルのデータの1つです。

都道府県(Prefecture)モデル、市区町村(City)モデルともに、「東京都」は1つだけ、また青梅市も世田谷区もそれぞれ1つだけモデルに存在することになります(現実世界でもそうなっていますね)。

 Unknownレコード追加とは?

都道府県モデルで言うと、prefectureカラムにunknownというデータを挿入。

これは不明なprefectureそのもののデータを追加することです。

たとえば

47 沖縄県 ~~

の後に 「48 東京県 ~~」
と追加idを付加し、追加します。

 店舗モデルはどういった設計をイメージしているのか?

これはわかりません。元の設計者の考えを聞くか、ここで公開していただくしかないですね。

ただ

CSVからインポートする際にprefectureやcityテーブルを参照して一致したら外部キーのidを書き込む、という方法なのでしょうか?

これは厳密な意味では間違いです。インポート作業はデータを流し込むだけです。

ただしインポートの前処理でありえない誤データの削除や、重複行を排除する作業をします。
テーブル(マスター管理テーブル)では、prefectureやcityテーブルを参照して一致したら・・・の処理は現実にはします
(もしマスターテーブルで ゆれがあると、これを参照する画面要素、リストボックスの表示に影響がでる、などありますからね)。

 「リレーションシップ」に関しての詳しい解説

このモデルは、DBシステムにおけるテーブルなどのスキーマ定義の元データです。
で、実行結果できるDBのテーブル(テーブルそのもの)は、各モデルが元になると思います。

そうなると、普通にDB理論におけるER図、
「エンティティとリレーションシップ」の考え方で通用すると考えます。
そして質問者の方の疑問点は、ずばり「リレーションシップ」の捉え方、 認識が設計者と違うということになります。


本題の

都道府県と市区町村というデータが保存されている、ということは
都道府県と店舗で言うと「1対多」と自分は感じましたが間違っているのことなるでしょうか?
「「東京都」はたくさんの「店舗」を持てる」というように考えると1対1ではないような気がしました。

1対1ということは例えば「東京都」というレコードが複数存在する可能性があるということでしょうか?

一般的なDBでの現実の世界からの「エンティティとリレーションシップ」の洗い出し法を元に、3つのモデルを見るといいです。

実際にはこんな感じで抽出していきます(関係ある一部のみ、書きます)

1.店舗(model)モデル、都道府県(Prefecture)モデル、市区町村(City)モデルが扱うエンティティ(モデル)があって、それぞれは属性を持つ、(以下、省略)

2.店舗(model)モデルは1つの都道府県(Prefecture)モデルを所有する(=のみ所有する)

3.店舗(model)モデルは1つの市区町村(City)モデルを所有する(=のみ所有する)

ここで太字にした箇所が誤解されている、異なる点ですね。
いずれも「1対1」です。

2.「「東京都」はたくさんの「店舗」を持てる」ではなく、(主体である)「店舗」は
現実には1つの住所しかもたないわけですから店舗モデルには1つの都道府県モデルが存在する。

3.同じように店舗は1つの区や市町村に属します。店舗モデルには1つの市区町村モデルが存在する。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/22 09:00

    回答ありがとうございました!

    > 1対1の関係、リレーションシップに関して
    説明を受けて腑に落ちました。これは自分が正しく理解できていませんでした。
    UserとTweetモデルの関係が1対多であった場合でも、「Tweetモデルのレコードの一つである「一つのツイート」に対して多の関係ではなく、「Tweetモデルに対して多だから1対多」」ということですね。
    これを今回の店舗と都道府県に置き換えてみると、当然1対多の関係ではありませんでした。
    一つの都道府県しか持たないですよね

    > Unknownレコード追加
    これは47都道府県がマスターとして存在しているとして、CSVから読み込んだ表記ゆれ等で判別出来ないものを追加という認識で大丈夫でしょうか?
    つまり、48 とーきょーと ~~ というような?

    > CSVインポート
    基本的にCSVから取り込む作業の事を指して、その他の処理はCSVのファイルの方を修正する(インポート前に処理)という認識でいいでしょうか?

    ちなみに今回の設計で、インポートするテーブルに「外部キーが存在する(prefecture, city)、かつnull制約」の場合、そのままインポート出来ないのでCSVの方に外部キーを追記する処理などを行うのでしょうか?

    キャンセル

  • 2018/04/23 11:30

    >Unknownレコード追加
    は外部キー制約の為に行うので、マスターに追加するってことです。
    CSV取込時に外部キーのエラーになる度にマスターに追加する作業を行うってことになります。
    ※事前にチェックして纏めて登録って方法もあるでしょうけど。

    キャンセル

  • 2018/04/24 12:23

    補足ありがとうございます。
    ということは、手順としては
    1. CSVインポート時、「住所の項目」をその都度マスターデータと照会
    2.照会してエラーの時(表記ゆれなど)に、マスターデータを追加する処理を行う

    ということをCSVインポートするプログラムを組む際に記述しておく、ということで合っているでしょうか?

    キャンセル

  • 2018/04/24 12:57

    インポート前に行う手順として問題ないと思いますが、参照されている質問の回答にあった通り、外部キー制約の本来の目的を果たしていない事はお忘れなく。

    キャンセル

  • 2018/04/24 17:00

    確かにそうですね、やってることはnullが入ることの代わりに新しくマスターデータを追加することで回避している、というような事ですよね。

    手順としては合っていたということ安心しました。ありがとうございます。

    キャンセル

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

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Ruby on Rails

    6755questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • MySQL

    5529questions

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

  • SQL

    2233questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • PostgreSQL

    992questions

    PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。