パスワードを忘れた? アカウント作成
10740289 story
プログラミング

今まで見た中で最もひどいDBのテーブル設計は? 107

ストーリー by hylom
女将を呼べ 部門より
あるAnonymous Coward 曰く、

今まで見たもっともクソなテーブル設計というブログ記事が話題になっている。

ここで言及されている「クソなテーブル」は、ありとあらゆるデータが1つのテーブルに放り込まれており、また各行にどのようなデータが納められているかを区別するための列が設けられているというものだったそうだ。

見方を変えれば最近普及が進んでいるKey-Valueストア型データベースのようにも見えるが、通常のSQLデータベースでこのような使い方をするのは確かにひどい。

ちなみにこのような設計は、SQLアンチパターンにて「Entity-Attribute-Value」として紹介されている。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by Anonymous Coward on 2014年03月06日 18時00分 (#2557608)

    ありとあらゆるデータが1つのテーブルに放り込まれており、また各行にどのようなデータが納められているかを区別するための列が設けられている

    後半部は兎も角、前半部(=1つのテーブルで済ます)は、通常のSQLデータベースでもそういう使い方することあるよ
    殆どのフィールドを検索条件に用いることがあって、しかもテーブル全部見ないといけない検索をする時はそれが一番速いから
    設計としては美しくないかもしれないけど、実用上はそのほうがいい、ってことはある

    自分が見た中で一番酷かったのは、おそらくシステムの拡張への対応を手抜きするためだったんだろうけど、たとえば「電話番号」のフィールドに「携帯電話」を付け足して、「000-000-0000|000-0000-0000」みたいに「|で区切って格納すること」とかいう変な要件加えてる、みたいなDBかな。至るところにそういうフィールドが混在してるの

    関係ないけどDBのテスト用IDが「scott」ではなく「tiger」とだけ書かれていたので
    パスワードが「scott」なのかな、と思ったらログインできず、発行者に問い合わせたら「bunny」だったことはある
    「パスワード書かなくても類推できると思った」じゃねえよ馬鹿

  • 自分で見たすごいのは、10000件位のデータ処理するのに、1レコードに30個くらいのサブレコードが定義されていて、データを30個ずつ分けて入れて300レコード位にしていた。 それを、集計したり、並べ替えをしたりするやつだった。 一件ずつにすれば1行で終わるような処理が二重ループ、三重ループになっていた。
    --
    -- 哀れな日本人専用(sorry Japanese only) --
  • by commonld (45958) on 2014年03月06日 18時54分 (#2557669) 日記
    見たいな感じでテーブル名カラム名に機種依存文字を...
  • by shuichi (572) on 2014年03月06日 19時03分 (#2557682) 日記

    今後、項目が増えたときのために、
    "予備1", "予備2" ...
    という列が定義されている。

    実際、その項目が使われても、ドキュメントの更新がされず、何が入っているか判らなくなる。

    • Re:予備項目 (スコア:4, すばらしい洞察)

      by Anonymous Coward on 2014年03月06日 19時25分 (#2557700)

      それはドキュメントのアップデートをきちんとしていないという、DBテーブルの設計が悪いこととは別の問題じゃないかな
      項目が必要になるたびに本番でALTER TABLE叩くっていうのもそれはそれでリスクがあるわけだし、予備を定義しとくこと自体はそう間違いではないと思う

      #逆に言うとどれだけ綺麗にDBテーブルの設計をしていても、改修に伴ってドキュメントのアップデートをきちんとしてなければ、それは「酷いDB」になるんだしさ

      親コメント
    • 「予備」って、COBOLで使ってた「FILLER」定義の名残かも。
      そもそもストーリーで挙げられてた例もCOBOLではよくあったこと。DB設計者の方がPGより年食ってるのかも。
      --
      ---- 何ぃ!ザシャー
      親コメント
    • by Anonymous Coward

      「○○を保存するようにしたいけど、カラムがないですねぇ」→「△△が使ってませんから、そこに入れることにしましょう」なんていう、カラム名と中身がまったく一致していない状態に比べれば、予備の方が格段にマシです。

  • by Anonymous Coward on 2014年03月06日 22時50分 (#2557868)
    > ある時点のデータを取得しようと思うと年月日時分秒がバラバラのデータで入っているので超絶扱いづらいというところでした。
    > また、普通なら一行で済むデータをinsertする際にも数行ひどいときには十数行insertが必要で、

    ブログをざっと見た感じだと別にそこまでひどくもないように見えたけど、よくよくこの二行みると
    年と月と日で 3レコード
    時と分と秒で 3レコード
    内容で1レコード
    の7レコード(IDは全部同じ)ていうテーブルなのかな?

    ID | TYPE | VALUE
    ------------------
    01 | YY   |  2014
    01 | MM   |  03
    01 | DD   |  1
    01 | HH   |  12
    01 | MI   |  10
    01 | SS   |  15
    01 | DAT  |  DATADATADATA
    02 | YY   |  2014
    以下略

    こんなのだったらたしかにクソだ。というか悪夢。

  • by SchwarzeKatz (34148) on 2014年03月07日 9時47分 (#2558105)
    商品の価格履歴とかを保存するテーブルなんだけど、1商品1テーブル。
    新商品作るごとに新しいテーブルも作成。
    でもテーブル構造は全てまったく同じ。
    新商品は年に何度も発生するので都度開発依頼。
    全商品の直近価格一覧表示しようとすると大量のDBアクセスが発生してやたら重い。
    どうしてこうなった?
  • by Seth (1176) on 2014年03月07日 10時11分 (#2558120) 日記

     予算の問題で設計ドキュメントが皆無だったので言迷のまま、
    LDAPのstrings属性?の移植??的に延々とVARCHAR2が続く
    RDBテーブル設計書(走召糸色木亥火暴)

     そのままLDAP使えば良いハズなのだが…(闇)

    --
    "castigat ridendo mores" "Saxum volutum non obducitur musco"
    • by Anonymous Coward on 2014年03月07日 11時11分 (#2558172)

      内容には全然関係ないけど、これだけは言わせてくれ。

      > ---------------------------------------- Everythings must be changed.
      20世紀の伝統芸能を今に残すあんたがそのシグネチャって、ナイスジョークすぎるww

      親コメント
  • by caesark (31961) on 2014年03月07日 16時48分 (#2558370)
    アイテムのマスタやらパーマネントな物体のテーブルがDDLごと公開されてまして、これに近い感じでしたね。
    #関係ないカテゴリが混じったテーブルではないですが
    アイテムの属性の種類やら数は不定なので理にかなってると思いました。
    http://wiki.eve-id.net/Category:CCP_DB_Tables
    SQLは結構ややこしくなりますが・・・
  • by Anonymous Coward on 2014年03月06日 17時58分 (#2557605)

    Oracle DBのレコードがvarchar2(256)の固定長。
    アクセスは先頭からn文字が○○で、次のm文字が××で…。
    そして、一月=1テーブル。

    これでパフォーマンスを上げろと言われても。
    というか、素直にCOBOLのままでええやん。

    • > varchar2(256)の固定長

      oracle8の頃はvarcharは可変長文字列でしたけど、最近は固定長になったのかしらん。

      それはそれとして。大昔の事ですが、レセプトじゃないけど国保絡みの案件。oracle8でdecimalのフィールドをado+vbsで受けると明示的な型変換を行わないと演算出来ないのはつらかったです。

      そのニ次開発で、データベースのスペシャリストと称する方の設計は、30個位ある文字列フィールドが全部固定長のchar(1024)になってて。これでストレージ足りるんですか?と聞いたら、おっとり刀で容量試算を始める始末。結果30TB位って、HDD1台で60GBとかの頃なんですけど。Sunのミッドレンジじゃ無理でしょ。

      DBだけが理由では無かったですが、プロジェクトは崩壊しました。

      親コメント
    • by Anonymous Coward

      バッチをCOBOLから .Net に移植したら処理時間が2倍になったあのレセコンですね?

    • by Anonymous Coward

      基本設計から作り直そうとしたけど大炎上、
      でもサーバリプレースは必要だからとりあえず設計は現行のままでJava,JSP,SVF,Oracleでとりあえず構築しました

      とか?

  • by Anonymous Coward on 2014年03月06日 18時06分 (#2557617)

    テーブル名が半角全角英数スペース日本語入り乱れている。

  • by Anonymous Coward on 2014年03月06日 18時11分 (#2557622)

    インデックスが張られていない

    • PKのみってあったねぇ・・・・・
      その上で、フィールドは固定長の上で配列変数のような構成

      こんなDB押しつけて置いて、出来上がったPGの処理が遅いと文句言われても・・・・
      テーブルリンクもさせずに全フィールド取得しかさせない癖に・・・

      で、正規化やらインデックス追加、テーブルリンクによる普通のSQL使用で圧倒的に早くなったサンプル見せても却下した癖に・・・

      火を噴く前にスキル的な事で他プロジェクトへ回ったんで助かったけど
      親コメント
    • by Anonymous Coward

      プライマリキーすら無いよりマシ

      • by Anonymous Coward
        プライマリキーしかないよりマシ
        # 全部合わせて複合主キーなんだって
        # 別の表は先頭32カラムだけが主キーだったけど、単にOracleの制限なだけで後ろのカラムも心の中では主キーなんだって
  • by Anonymous Coward on 2014年03月06日 18時20分 (#2557627)
    緯度経度のフィールドが、度、分、秒、秒少数点 に分けられてた。 データサンプルが 35.12.10.4 とかだったから?? サンプルが35/12/10.4って書いてあったらまた違ってたんだろうな...
  • by Anonymous Coward on 2014年03月06日 18時21分 (#2557628)

    >ありとあらゆるデータが1つのテーブルに放り込まれており、また各行にどのようなデータが
    >納められているかを区別するための列が設けられているというものだった

    IPAの未踏か何かでそんなのを見たような見なかったような....

  • by Anonymous Coward on 2014年03月06日 18時28分 (#2557637)

    ああ、Entity-Attribute-Value作っちゃったことあります。
    めったに使わない部分だったせいかこの問題はスルーされて開発は進み、後で気付いたものの言い出せなくなり・・・
    運用まで見守りましたが、その後どうなったのかは知りません。

    • by Anonymous Coward on 2014年03月06日 18時53分 (#2557667)

      俺も。だって客が項目動的に増やせるようにしたいとか言い出すから・・・会社的な事情により、システム自体がほぼ使われなくなったらしいので、犠牲者が出なかったことだけが幸い。
      あれは動的にテーブル作っちゃえばよかったのかなぁorz

      # さっきSQLアンチパターンの電子書籍版買ったとこなので、これからセルフ反省会。

      親コメント
      • by wolf03 (39616) on 2014年03月07日 1時52分 (#2557960) 日記
        メニューアプリ用データにしか使った事無い。
        システム用のプロテクト掛けたファイルとユーザ用の編集可能なファイルに分け、初回実行時にPCの命名規則から前者のファイルを使ってシステム用の初期メニュー生成させていた。
        ユーザ用はその後に自由にファイルや実行ファイルの登録も出来るようにして。
        #Windows+VBの荒技
        親コメント
      • by nim (10479) on 2014年03月06日 18時55分 (#2557671)

        うんうん。動的に項目を増やしたいときにはつかっちゃうよね。
        Redmine のテーブルも、チケットのカスタム項目のところはそんな風になってる。

        親コメント
    • by Anonymous Coward

      俺も。
      懺悔するしかない。ごめんなさい。

    • by Anonymous Coward

      XMLそのまま突っ込んで、取得後パースしていた私も同罪か・・・

  • by Anonymous Coward on 2014年03月06日 18時47分 (#2557659)

    じつは dbm とか Berkeley DB あたりから引き継がれているデータベースだったりして…

typodupeerror

Stay hungry, Stay foolish. -- Steven Paul Jobs

読み込み中...