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

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

ただいまの
回答率

90.34%

  • Python

    9187questions

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

  • Python 3.x

    7392questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

データベースを使うこととバイナリデータファイルに保存することの違い

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,103

starrow1103

score 103

 環境

macOS Sierra
Python3.6.0

 わからないこと

初歩的な質問になってしまいますが、「データベースを使うこと」の意味はなんでしょうか?

例えば、userとpasswordを登録し、参照し使えるようなプログラムを書く時、dictionary機能で十分だと思うのです。

以下、簡単なログイン機能をpickleでつくってみました。

# accounts.pickleファイル内に{"user1":"pass1","user2":"pass2"}があるとします。
import pickle

def open_file():
    with open('accounts.pickle', mode='rb') as f:
        accounts = pickle.load(f)
    return accounts

def save_file(accounts):
    with open('accounts.pickle', mode='wb') as f:
        pickle.dump(accounts,f)

def add_account(accounts):
    while True:
        new_username = input('Enter a new username:')
        if new_username not in accounts:
            new_password = input('Enter a new password:')
            accounts[new_username] = new_password
            save_file(accounts)
            print('NOW YOU HAVE A NEW ACCOUNT.')
            break
        else:
            print('ALREADY EXIST!')
            continue

def login(accounts):
    username = input('Enter your account name:')
    if username in accounts.keys():
        password = input('Enter your password:')
        if password == accounts[username]:
            print('LOGIN SCCEEDED!')
        else:
            print('WRONG PASSWORD!')
    else:
        print("NO EXIST")

accounts = open_file()
add_account(accounts)
login(accounts)

結局のところ、情報の単純なファイル管理と、データベースでの管理の違いはなんでしょうか?
userに対する情報量が多くなってくるとめんどくさいのでデータベースを・・・という考えなのでしょうか。
それとも、セキュリティ面からの必要性でしょうか(だとすればどう違うのでしょうか)

以上、データ保存についてよくわらない小生にご教授くださいm(_ _)m

追記:
誤解を招く例文で申し訳有りません。自分は必ずしも「ログイン機能」を作りたいわけではありません。

「果物の名前と値段」、「映画の作品名と監督名」などの管理を「データベースで行う」のか「平ファイルで行う」のか、そこらへんの判断基準はどうであろうかというのがこの質問の意図です。

わかりにくくてすみません・・・。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 5

checkベストアンサー

+6

テキストベースかデータベースか。
よくある話として、「データベース」について過剰に拒否反応を示す「発注者」や「プログラム初心者」がいて、どうもテキストの方が、簡単で、簡単だから安価に発注できると考えてしまう人が多いのも事実です。

いわゆるRDB(リレーショナル・データベース)においては、「データを安全に保存する機能」「データを高速に検索する機能」という2点が最も重要な役割です。

・万が一の時にデータを復元する機能
・外部キー制約によって、論理上矛盾するデータを排除する機能
・排他処理によって一方の更新を許可し、他方の変更を拒否する機能
・インデックスにより高速に検索する機能

これらをテキストベースで実現するのは、相応のコーディングが必要となり、安全なアプリケーションを作成する上では、RDBを使うというのが、現実最も楽な方法です。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/03/03 21:23

    より分かりやすく具体的に解答いただきありがとうございます。

    はじめに解答いただいSurferOnWwwさんのリンク先にあるような事例に近いですね。(本当にそんな安易な考えで楽なほうへ進めようとするプロや発注者が存在するのは残念です。)

    これでなんとなくデータベースの利点や平文との違いのイメージがついたので、ベストアンサーとさせていただきます。
    本当は御三方にベストアンサーを差し上げたいところです。

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

    キャンセル

  • 2017/03/03 21:35

    ???
    「発注者」がそう考えるのは何の問題もないと思いますけど…

    キャンセル

+4

データベースもファイルシステムも使い分けすればいいのです。
どちらかがどちらかの上位互換ではなく、どちらにも長所と短所があります。

例えば、質問の簡易ログインを例に挙げるなら、これ、複数のアクセスが同時にあって、読み出している最中にファイルが書き換えられたらどうなりますか?
また、読み込みに失敗したファイルをそのまま保存してしまったら?
データベースならその心配はありません。

ファイルシステムを使っても、山ほどコードを書けばデータベースに匹敵する高機能なデータ管理システムは作れるでしょう。しかし人は今度はそれをデータベースと呼ぶでしょう。

データベースの長所は高機能であることです。同時アクセス以外に、検索の速さに関してもセキュリティに関しても、データ構造の変化に柔軟に対応できることに関しても、環境の移行に強いことに関しても。

ファイルシステムを使ったデータ管理の長所は手軽なことです。データベースのインストールは必要ありません。

年賀状を書くのにプロを雇う人は多くありません。でもどんなことでも自分ですればいいじゃんと言うわけにもいきません。
たとえ自分でできたとしても、プロに頼むことのメリットはあります。
データを扱うプロフェッショナルがデータベースです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/03/03 21:32

    なるほど!詳しくご説明いただきありがとうございます。

    同時にアクセス、たしかに、ただのファイルでそんなことが起こったらすぐにおかしくなりそうです。

    さらに勉強してみようと思います。

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

    キャンセル

+1

あなたが作った「簡単なログイン機能」というのはセキュリティ的に問題ないのですかね? 多分そうではないと思うのですが。

DB を使うかどうか以前に十分なセキュリティを持つユーザー管理システムを自分で作れるかを考えた方がいいと思うのですが。

本当は怖いパスワードの話 (1/4)
http://www.atmarkit.co.jp/ait/articles/1110/06/news154.html

自分で作れなくて、フレームワークが持つシステム等を利用せざるを得ないなら、好むと好まざるとにかかわらず、使用できるユーザー情報のストアは限られてくると思うのですが。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/03/03 20:32

    あ、いや、

    ちょっと例えが悪かったかもしれません。

    果物の種類と値段のデータや、本のタイトルと作者のデータ保存でも同じように書けると思うのですが、この場合別に盗まれても良いデータですよね。

    管理を「データベースで行う」のか「平ファイルで行う」のか、そこらへんの判断基準はどうであろうかというのがこの質問の意図です。

    わかりにくくてすみません・・・。

    キャンセル

  • 2017/03/03 21:15 編集

    > 管理を「データベースで行う」のか「平ファイルで行う」のか、そこらへんの判断基準はどうであろうかというのがこの質問の意図です。

    それもどんなアプリか、使用するフレームワークは何かによると思いますよ。Web アプリなら、LAMP, WISA という言葉があるように DB の使用が前提で、「平ファイルで行う」というのは考えもしない(と言ったら言い過ぎかもしれませんが)と思いますが。

    どんなアプリか、どんなフレームワークかという話がまずなければ、質問者さんの質問は漠然としすぎているような気がしますけど。

    キャンセル

  • 2017/03/04 00:25

    例えば今練習で作ろうとしているのは、Flaskを用いて
    ・フォームで受け取ったURLを元に
    ・ユーザーが欲しいHTMLタグを生成
    するような簡単なWEBアプリを考えています。

    さてそうした時に、早いうちにDBを理解し使えるようにする必要があるとはわかっていながらも、
    現時点のアイデアでデータベースまで構築する必要はあるのか?
    いったいどういう段階でデータベースを構築する「必要性」が出てくるのか?

    という疑問から質問させていただきました。


    話は逸れますが、
    本当はユーザー登録やらパスワードやらで縛られるような世界は作りたくないんですよね。
    みんなが好きに訪れて、目的のことが達成できて、好きなだけ情報を共有できる場所が多いほど良いことなんじゃないかと思ってます。

    これから、いろいろと勉強します!

    キャンセル

  • 2017/03/04 21:25

    > 簡単なWEBアプリを考えています

    Web アプリを作りたいと考えているのでしたら、DB の使用を避けて通れないと思います。

    > 現時点のアイデアでデータベースまで構築する必要はあるのか?

    とか考えてないで、データーベースのを使えるように勉強することをお勧めします。


    > みんなが好きに訪れて、目的のことが達成できて、好きなだけ情報を共有できる場所が多いほど良いことなんじゃないかと思ってます。

    本題とは違うことですが気になったので一言。

    ネットには善意の人ばかりではなく、悪意を持っている人もいる・・・ということは私が言うまでもなくご承知だと思いますが、「みんなが好きに訪れて」ということを許すと、2ch のようになったり、ボットがスパムコメントを書き込んだりということがあるので、何らかの制限は必要だと思います。

    キャンセル

+1

まあ、データベースと一言でいってもピンキリですからね~

・データがとても大量になると予想される場合
・複数のプロダクトからアクセスする場合
・開発言語の変更が予想される場合

あたりが一般的な話になるのかなあ。
小規模なものやプライベートなものなら
それこそ好きなようにすればいいと思います。
最近では小規模用のデータベースもあるようなので
一概にこうだとは言えませんが、まあ、こんな感じ?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/03/03 21:02

    ありがとうございます。

    開発言語が変わる場合
    これはまったく考えもしませんでした、なるほど、そういうことも起こりえますよね。


    ここでさらに質問させていただきたいのですが、
    「データがとても大量になると予想される場合」にデータベースを作成するのは、なぜでしょうか。

    平文よりもバイナリデータのほうがコンパクトになるのは分かりますが、それ以上にコンパクトになるものなのでしょうか。

    また、そういった観点からデータベースについて学べる文献などありましたらご紹介いただけると助かります(^^;;

    キャンセル

  • 2017/03/03 21:08

    教科書を読んでいたらDBを使う説明に「最適化されていて」「高速に」「簡易に記述できて」「ロックが自動でかかる」だからだそうです。

    キャンセル

  • 2017/03/03 21:12

    おぉ、速度の観点から考えていませんでした。なるほどそういう利点もあるのですね。

    ロックが自動で、、、という部分はちょっとよくわからないので勉強が必要そうです(^^;;

    キャンセル

  • 2017/03/03 21:52

    そうですね~ データベースには高速にアクセスできるように
    いろいろ仕掛けが提供されていますので、そういう意味で
    適しているってことです。

    「ロック」とか「排他制御」てのはデータベースが提供する
    機能の一つで、あるところから更新しようとしているものを
    別のとこから(処理がおわるまで)更新させないようにする機能ス。

    キャンセル

  • 2017/03/03 23:31

    なるほど、詳しいご説明ありがとうございます。

    やはりそこが決定的な差、強みであると言えそうですね

    キャンセル

0

1・堅牢。データが肥大しても壊れにくい。

2・検索が高速。「そんなにたくさんのデータを扱うわけではないよ」という人でも比べて見みればなるほど素晴らしいと思うはず。

3・複雑なクエリを1行で書ける。たとえばゲームの登場キャラのデータベースを作ったとして、「赤属性」の「ガールズ系」で「最近1ヶ月以内に追加されたキャラ」を「最大HPが高い順」に並べるなんてことが簡単にできます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/03/04 00:32

    回答ありがとうございjます。

    やはりDBを使うべきは「属性値(というのでしょうか?)が多ければ多いほど」ということになりますね。
    うーん、寝ずに勉強したくなってきました。

    キャンセル

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

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

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

  • Python

    9187questions

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

  • Python 3.x

    7392questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。