• ベストアンサー

レコードに対する各ユーザの未読管理

メインのテーブルのレコードに対する、ユーザごとの未読・既読フラグをつけたいと思い、いろいろな案を考えてみてはいますが、何か懸念事項がありなかなかいい方法が見つかりません。 サーバにDBがあり、メインテーブルに 管理番号・版数・内容・削除フラグがあるとします。 ※管理番号・版数が主キー 各ユーザは、VBで作成したシステムから上記テーブルへ更新を行います。 ※各ユーザはクライアントに依存せず、様々なPCからログインをし、ユーザ数は増減します 新規の場合、MAX(管理番号)+1 を管理番号に設定し、版数を1で登録します。 修正の場合、既存のレコードに削除フラグを立て、管理番号は同じで版数を+1してINSERTします。 削除の場合、削除フラグをたてます。 新規・修正の場合、登録ユーザ以外のユーザは未読として扱います。 また、未読の間に何度も版数アップされても、他のユーザは最新のレコードのみ閲覧し、既読にします。 未読フラグについて、自分なりにいろいろ考えてみましたが、それぞれ懸念事項が発生します (1)メインテーブル(もしくは他のテーブル)のレコードに対して、未読フラグフィールドを設定   ・ユーザ情報を格納してるテーブルに、各ユーザ事に1から連番を振っておく   ・未読フラグは「01001」のようにデータを持たせ、1番のユーザは未読、2番のユーザは既読と判断する  →ユーザが減少したときに無駄なビットがどんどん増えていく (2)別テーブルに、管理番号・ユーザID・(版数)を持たせる   ・レコードがあるときは未読で、既読の時はレコードを削除  →登録時にユーザ数分レコードを作る必要があり、負荷がかかる。しかし、基本は未読→既読のため、データの圧迫はほとんどなし。 (3)各ユーザ事に未読フラグフィールドを作成   ・「010010011100」のようなデータを格納   ・管理番号を1からの連番にし、管理番号のビットが 0なら未読・1なら既読  →修正で更新した際に未読にするのが大変 (4)メインテーブル(もしくは他のテーブル)へ各ユーザようにフラグを管理するフィールドを設定  →フラグ管理をしたり、他ユーザが更新・追加をしたときに楽。しかし、ユーザが増えた時に都度フィールドを追加しなければならないため、現実的ではない。 といった感じです。ちなみに環境は、 OS:XP 、 PG:VB.NET 、 DB:ACCESS or SQLServer になります。 今のところ(1)が一番有効方法かと思いますが、他にもっと効率の良い方法を探しています。 とても長文になり、また分かりづらい文書になってしまいすいません。 同じような経験があるかたや知識豊富な方、ぜひご教授お願いします。

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

  • ベストアンサー
  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.1

(1)または(2)の方法、どちらにしても、 1番のユーザはAさん 2番のユーザはBさん と静的に対応させる必要はないんじゃないかな、と思います。 どういうことかというと、(1)の方法でいうと、 未読フラグは「01001」としたら、 1番のユーザは、対応テーブルを参照して、Aさん で未読 2番のユーザは、同じくBさん で既読(または更新者) 3番のユーザは現在いません。 4番のユーザは、同じくDさん で未読 5番のユーザは、同じくCさん で既読(または更新者) 対応テーブル 位置 数値(未読フラグの何バイト目に対応するか) ユーザ 文字列(ユーザID) <データ> 1,AさんのID 2,BさんのID 4,DさんのID 5,CさんのID ・・・ユーザー登録・更新・削除時にいっしょに処理します。    メインテーブルの登録・更新・削除は関係しません。 また、(1)の方法に関して言うと、 メインテーブルの更新者を記録しておきたかったら、 メイン以外の別テーブルに分けたほうがいいと思う。 文書の更新は、メインテーブルの更新者IDを更新するが、 文書閲覧でメインテーブルが更新されたら、更新者IDを更新してはいけない、 なんてややこしいことになるから。 項目としては、管理番号・版数・未読フラグ・削除フラグ(管理番号・版数キー)か 管理番号・未読フラグ・削除フラグ(管理番号キー)か。 削除フラグは、未読の一覧を出すとか言うことがあるならあると楽だがいらないかもしれません。 修正の取消っていうのがあるなら、管理番号・版数キーにしておかないと、1世代前へ戻れません。 (ないなら、どちらでもいいと思います。) あと、アクセス権限という概念はないんですね? 例えば、登録や更新した人以外の人が勝手に削除していいのか? とか、参照してほしくない人がでてきたら除外できない、とか・・・。 ⇒何か作るのなら、未読フラグに2とか3とか作れば簡単に対応できそうですが。

関連するQ&A

  • 2つのテーブルで重複する値のレコードを削除したい

    削除クエリ?重複クエリ?について教えてください。 テーブル1 フィールド"番号"には 1 2 3 テーブル2 フィールド"番号"には 3 4 5 があるとします。 「テーブル2と重複しているテーブル1のレコードを削除する」 (この場合「3」が重複しているのでテーブル1の3が入力されているレコードを削除) としたいのですがどいゆうSQL文を書けばいいのかわかりません。 ご教授よろしくお願いします。

  • 2つのテーブルに共通するレコードを削除したい

    2つのテーブルがあり、両方にID番号フィールドが存在しています。 Aテーブルは元のデータ Bテーブルは削除したいレコードのID番号 という構成になっているとき、 AテーブルとBテーブルの共通するレコードを削除するにはどうすればよいでしょうか。 ものすごく単純な質問で申し訳ないのですが...宜しくお願いします

  • Accsess レコードの追加

    超素人ですが、Accsessについて教えていただきたいです。 テーブル30枚ほどあります。共通フィールドは研究番号(文字番号)となっています。 テーブル1 対象者情報 フィールド1.研究番号 2.年齢 3.職業など テーブル2 検査1 フィールド1.研究番号 2.検査項目1 全部20項目 テーブル3検査2 フィールド1.研究番号 2.検査項目1 全部35項目 このようなテーブルが30枚あります。 たとえば、対象者情報10人分のデータがあります。 検査1を受けた人はそのうちの5人、 検査2を受けた人はそのうちの6人。 普通に入力すれば情報10人、検査1は5人、検査2は6人になりますが、 したいことは、 情報の研究番号を追加したとき、他のすべてのテーブルの研究番号に反映することはできますでしょうか。 すべてのテーブルのレコード数を同じにしたいです。 大変困っております。助けてください。

  • 【Access】レコードが削除できない

    どんな操作をしてそうなったかわからないんですが、 テーブルの最終行に全フィールドのデータが「#Deleted」になっているレコードが出来てしまいました。 このレコードを削除し、一旦テーブルを閉じて、また開くと同じものが復活しています。 どうすれば消せますでしょうか??

  • 一致するレコードを削除したい。

    質問します。ACCESS(office2000)を使って下記の様に実行したいのですが。 テーブルA         テーブルB 商品名、 管理番号    単価、 管理番号 パソコンA   101      \1,200  112 パソコンB  102       \1,300  102 パソコンC  103      \1,500  123           ↓ テーブルA 商品名、  管理番号 パソコンA  101 パソコンC  103 削除クエリを実行して管理番号が一致するレコードをテーブルAから削除したいのですが、削除クエリどうやって設定すればいいのでしょうか。どうかご教授をお願い致します。

  • レコードの更新履歴について

    Oracle初心者です。 レコードの更新履歴を残す方法を考えているところです。 ■やりたいこと 1)登録、更新、削除の全てについて 2)実行前のレコードを抽出したい 3)特定レコードの更新履歴を一覧として表示したい ■対象レコード ID(主キー、ユニーク) フィールドA(テキスト) フィールドB(テキスト) フィールドC(テキスト) 1つ方法として・・・ 履歴を残したいテーブルと同じ構造の履歴テーブルを作成して、登録、更新、削除が行われる際、必ずこの履歴テーブルに登録することを考えました。 が、あまりスマートでない気もしましたので質問します。 他によい案はありますでしょうか?

  • アクセスサブフォーム2つを同時にレコード移動したい

    お世話になります。 メインフォームに サブフォームが2つあります。 片方のサブフォーム内のレコードを移動させたら、同時にもう片方の方も自動的にレコード移動をさせたいです。 理由は、テーブル内のフィールド数が255個までのため分割してるからです。 本来、両方合わせて1つのレコードだからです。 よろしくお願いします。

  • SQLデータ修正時に『このレコードは他のユーザーによって変更されています。~』

    お世話になります 早速ですが、現在ACCESS97で作成したフォームで SQLServer7 上のテーブルをリンクしてさわってるのですが あるフォームのみデータ変更時に下記メッセージが出て どうしても修正ができません。 ************************************************************ 『このレコードは他のユーザーによって変更されています。 [レコードの保存] を選択すると、他のユーザーによる変更を無視し、 自分が行った変更を反映します。 [クリップボードにコピー] を選択すると、変更したデータはクリップボード にコピーされ、他のユーザーによる変更が反映されます。 必要に応じて、クリップボードのデータを貼り付け、自分が変更した データに戻すこともできます。 「レコードの保存(S)」 「クリップボードにコピー(C)」 「他のユーザーによる変更を反映(D)」 *********************************************************** しかも「レコードの保存(S)」ボタンはグレイアウトされており 押すことができない為、データ変更が全くできません。 また、以前から存在するデータは修正が可能なのですが、 このフォームで新規に追加したレコードのみ上記の現象で 修正できない状況です。(新規追加時にコミットされずに宙ぶらりんな感じ・・・) こうなったレコードはACCESS97上からリンクしたテーブルを直接開いて修正しようとしても 同様のメッセージが出て修正不可のままです。 結局SQLのエンタープライズマネージャから修正するしか手がないのですが、 どうしてこんなことになってしまうのでしょうか? どなたかお知恵をお貸しください。 どうかよろしくお願いいたします。

  • 削除するレコードを含んだテーブルを指定してください

    DELETE テーブルA.店名, メインテーブル.店名 FROM メインテーブル RIGHT JOIN テーブルA ON メインテーブル.店名 = テーブルA.店名 WHERE (((メインテーブル.店名) Is Null)); というSQL分で、メインテーブルにないけど、テーブルAにはある、店名を削除しようとしたら、 「削除するレコードを含んだテーブルを指定してください。」 となってしまいます。 実際は30レコードくらいあります。 なぜ、削除できないのでしょうか?

  • テーブルの最後(最新)のレコードを抽出したい

    宜しくお願いします。 PHP MYSQL の組み合わせで使っています 以下のようにして、最後のレコードを取り出したいのですが まったく違う事をしているのかもしれません。 $sql =" select * from テーブル where フィールド='max' " ; フィールドはauto_incrementで番号を振っています。 これで最大のつもりなのですが・・・。 他にも、レコードを入れた時間も記録したフィールドがあるのですが どうしてよいか?判りません。 テーブルの最新のレコードを出したいのです。 **その中の一つのフィールドを取り出すのですが、   それはうまくいっているみたいです    (max の所に数字を入れると表示します) お手数かけますが、どなたかご教授お願いいたします。

    • ベストアンサー
    • MySQL