OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

keyの最大値を取得する方法

  • 困ってます
  • 質問No.108574
  • 閲覧数86
  • ありがとう数5
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 81% (9/11)

こんにちは。
以前DBMについて質問したchocolatsです。
おかげさまで、なんとか使えるようになってきました!

さて、現在DB_Fileを使用して掲示板を作っています。
投稿者の発言に、管理者がレスをつけるといったいわばオーソドックスなBBSです。
書き込み時に書き込み数(カウント)をkeyとしてデータを格納しているのですが、当初何も考えずに
$no = scalar keys %DB;
$no += 2;
$DB{$no} = "$no$delim$name$delim$addr$delim・・・・";
#$delimは適当な区切り文字です
としていましたが・・

これだと、当たり前の話しですが、投稿削除や、ログ消去ができないんですよね!^^;
サーバーの容量が50Mですので、ログファイルにとれる容量は多くても1M以下にしておきたいのです。
かなりの件数までは保存できそうですが、いつかはデータの一部削除をしなくてはいけませんし・・

そこで、伺いたいのですが、
■%DBのキーで一番大きな数字を取得する方法
はどういったものがあるのでしょうか。

私に考え付くのは、読み込んで、逆ソートして、一番目のデータを取得する・・といった手段ぐらいです。
これでは要領が悪い(負荷が大きい)ように感じるのですが、他にいい方法があれば、ぜひ教えていただけないでしょうか。

何か足りたい情報がありましたらお知らせください。補足します。
通報する
  • 回答数3
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.3
レベル12

ベストアンサー率 61% (349/567)

>つまり、書き込み内容などの問題で部分的に記事を削除する場合は
>・データは保存したままで、表示はしない(書き込みナンバーを常に連番にするなら「削除しました」と表示するなど)
>という事ですよね。

ええ、そうです。

>で、データファイルから100件まとめて消す時は、消す前にトータル書き込み数を$maxなどに保存しておきそこから参照して$noを設定すればいい、という事ですよね。

ちょっと違います。消す前に$maxに保存しておくのではなく、$maxは常に最新の、最後の投稿の番号を保存してある形にしています。

私の場合は、まとめて消すというより、ファイルを大きくしないためのバックアップなので、必ず若い番号からまとめて削除します。
なので、現在データファイルにある投稿の番号が何番から何番までなのかを、$min~$maxでわかるようにしているのです。$minは当初1で、バックアップで100件削除すれば101になると。$maxは投稿があるたびに、プログラムで1ずつ増えていくので、最新の番号を指していると。こういうことです。

ただ、これはあくまでも私がそうやって作っているということであって、ひとつの考え方ですので。

ついでに少し説明しておくと、私のプログラムの場合、掲示板をデフォルトで開くと、$maxから20件をDBMから読み出して表示します(最新からの読み出し)。$maxを読むことで、表示すべきメッセージの番号が確定する($max,$max-1,$max-2,...)ので、ソートなどがいらず、プログラムもシンプルになります。
古いメッセージへさかのぼってページめくりしていくとき、どこかで最も古いメッセージへ行き当たり、それ以上表示できなくなりますよね。それを$minで管理しています。

そんな感じです。
補足コメント
chocolats

お礼率 81% (9/11)

前回の確認部分は間違ってましたが・・(恥)
しかし、tabaさんの考え方どうりで思ったものが出来ました!!
なかなか理解できなくてごめんなさいでした^^;
詳しい解説とアドバイス本当にありがとうございました。
大感謝です!
投稿日時 - 2001-07-27 15:53:00
お礼コメント
chocolats

お礼率 81% (9/11)

すみません、やっとわかりました!^^;
ちょっと日本語がおかしいですが

if($DB{'max'} eq ''){#最大数が設定されてなかったら
$no = scalar keys %DB;#データ数を取得
}else{#入ってたら
$no += $DB{'max'};#現在の書き込み数を取得
}
$no++;
$DB{'max'}="$no";#最大の書き込みナンバーを保存
$DB{$no} = "$no$delim$name$delim$show......";

で、削除時に削除数を$minに保存し、
読み込み時に$min>0の条件で出す、という事ですよね。
読み込み方法はtabaさんと同様の考え方になっています。

ありがとうございました!まずこれでやってみます。
しかし、念の為もうちょっと締切らないでおかせて下さい^^;
投稿日時 - 2001-07-26 14:27:40
-PR-
-PR-

その他の回答 (全2件)

  • 回答No.1
レベル12

ベストアンサー率 61% (349/567)

私もDBMを使って掲示板を動かしていますが、私の場合は書き込み数の最大値を保存しています。 $max = $DB{'max'} $max++; $DB{$max} = "$max$delim$name$delim$addr$delim・・・・"; という感じでしょうか。 この場合、keyを全部取得してソートして表示するようなコードを書くときにmax ...続きを読む
私もDBMを使って掲示板を動かしていますが、私の場合は書き込み数の最大値を保存しています。

$max = $DB{'max'}
$max++;
$DB{$max} = "$max$delim$name$delim$addr$delim・・・・";
という感じでしょうか。

この場合、keyを全部取得してソートして表示するようなコードを書くときにmaxを別途処理しなければならないので気をつける必要があります。
私の場合は、常に番号を指定して呼び出す(投稿の1から10までとか)ようにしているので、同じDBに入っていても問題ないんですが。

最近はメンテナンス用に$minも設定し、数が大きくなった場合は$minを1から例えば1001に変えて、DBから1000件削除するというような対応をしています。
(表示する投稿は、$minから$maxの範囲とする)

直接の回答じゃないですけど、ひとつの考え方ということで。
お礼コメント
chocolats

お礼率 81% (9/11)

ありがとうございます!
>メンテナンス用に$minも設定
なるほど、こういうやり方もあるんですね。
しかし、部分的に削除した場合にはちょっと辛いですね・・。

また、質問の仕方がいまいちでした。
$DB{$no}のキーが、1.2.3.4...105だったとして、
書き込み編集後1.3.8...104になるとします。
この状態で次の書き込み時に$no=105としたいのです。
また、例えば1000件書き込まれた時点で200件を削除するとして、
その場合にも次の書き込み時には$no=1001となればいいのですが・・
せっかくDBMを使っているのでメモリに全部読み込んでしまうのはもったいないかなと考えています。(現在はキーの総数を取得しています。)
すみません、もう少しみなさんのご意見を伺わせてください。
投稿日時 - 2001-07-24 20:54:59


  • 回答No.2
レベル12

ベストアンサー率 61% (349/567)

>しかし、部分的に削除した場合にはちょっと辛いですね・・。 そうですね。あくまでもまとめてバックアップを取ったときの処理で、部分的に削除したときは別のロジックで処理しています。削除したところのデータ($DB{$no}の中の$deleteとかいう変数)に削除されたことを示すフラグを立てるような形です。 >$DB{$no}のキーが、1.2.3.4...105だったとして、 >書き込み編集後1 ...続きを読む
>しかし、部分的に削除した場合にはちょっと辛いですね・・。

そうですね。あくまでもまとめてバックアップを取ったときの処理で、部分的に削除したときは別のロジックで処理しています。削除したところのデータ($DB{$no}の中の$deleteとかいう変数)に削除されたことを示すフラグを立てるような形です。

>$DB{$no}のキーが、1.2.3.4...105だったとして、
>書き込み編集後1.3.8...104になるとします。
>この状態で次の書き込み時に$no=105としたいのです。

このあたりは全体の整合性を取らないといけないので、部分的に論じるとうまくいかないかもしれませんね。
ただ、maxという値を保持するというのは、つまり次の番号が何になるかを、これまでの値とは別に持っておくということです。
105まで書き込まれたとき、私のコードではmax=105になっていて、次の書き込みをするときは105に1を加えてkeyを106にします。
直前に削除があって105が無くなっていたとしても、次が106になってもいいのではないですか?(飛び番号ができるのは構わないのですよね?)何か勘違いしていたら指摘してください。

上にも書きましたが、私の使っているコードの場合、削除があってもメッセージの実体は削除せず、削除されたメッセージという扱いで「表示しない」というプログラムにしています。なので、連番は崩れないんですよね。

つまり、削除とバックアップは別になるわけです。伝わりますか?
補足コメント
chocolats

お礼率 81% (9/11)

ご丁寧な回答ありがとうございます!わかってきました・・・!
つまり、書き込み内容などの問題で部分的に記事を削除する場合は
・データは保存したままで、表示はしない(書き込みナンバーを常に連番にするなら「削除しました」と表示するなど)
という事ですよね。
で、データファイルから100件まとめて消す時は、消す前にトータル書き込み数を$maxなどに保存しておきそこから参照して$noを設定すればいい、という事ですよね。

この認識で間違っていたら教えていただけないでしょうか。
何度もすみません、平行してこちらも試してみますが、よろしくお願いします!
投稿日時 - 2001-07-25 20:39:49
このQ&Aのテーマ
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ