• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:GAE 多対多モデルのデータ削除について)

GAE 多対多モデルのデータ削除について

このQ&Aのポイント
  • Google app engin の datastoreで多対多を下記ページなどを参考につくりました。
  • グループのオーナーがグループを削除する際に、参加しているユーザーのgroupから、削除するグループのkeyを削除する必要があります。
  • GAEはデータの変更・削除に結構時間がかかります。仮に数万人所属しているグループがあったとし、このグループをオーナーが削除する場合、グループに所属しているユーザーのgroupに全てアクセスし、該当グループのkeyを削除する操作は非効率(30秒を超える可能性が十分あるの)ではないかと思っています。

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

  • ベストアンサー
noname#161640
noname#161640
回答No.1

GAEは、ちょっと特殊ですからね……。あんまりいい方法とは思えないのですが、削除するときは、単純にGroupsのownerをクリアするだけにしてはどうでしょうか(ownerが、グループの作者を示すデータですよね?)検索時に、グループのownerがないときは「そのグループは抹消済み」として表示しないようにするなど対処しておくわけですね。 そして、それとは別に、CRONなどを使って定期的にownerが空のGroupsを検索し、そのGroupsが保管されているUsersを少しずつ(一度に最大1000ずつとか)取り出してはgroupを更新していく、というのはどうでしょうか。いわば、ガベージコレクションをCRONで作るわけです。あるいは、最悪、手動で定期的に削除してもよいでしょうし……。

endoyuta
質問者

お礼

早速ありがとうございます。ということは、やはり参加ユーザー全員のgroupから該当するkeyを瞬時に問題なく消すことは難しいのですね。。おっしゃるとおり、ownerがグループの作者です。教えていただいた方法で対処したいと思います。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • [DB設計]多対多の問題点とは

    現在あるシステムを作成する上で、DB設計をしています。 このDB設計をする上で、多対多の状態だと良くない(できない?)とよく聞きます。 例)一人の学生は複数の講義を受講し、一つの講義には複数の学生が受講する。 この時に、学生の情報を格納する「学生DB(主キー:学生番号)」と、講義の情報を格納する「講義DB(主キー:講義番号)」を作成します。そうするとこの二つのDBの関係って、多対多になってしまうと思うのですが、この場合どのような問題が起きますか? 例がちょっとわかりにくいかもしれませが、要は 「DBを多対多の状態で設計した場合の問題点は何か?」 ということをお聞きしたいです。 よろしくお願いします。

  • pythonでtwitterAPIを使用としたときのGAE上でのエラー

    pythonでtwitterAPIを使用としたときのGAE上でのエラー <class 'urllib2.HTTPError'>: HTTP Error 401: Unauthorized GAE上にこの様なエラーが出てしまい。twitterbotに反映されません。 import urllib2は行っているのですが原因が分からず困っています。 よろしくお願いします # -*- coding: utf-8 -*- import twitter import random import os # from tenki import information from google.appengine.api import users from google.appengine.ext import webapp from google.appengine.ext.webapp import util from google.appengine.ext.webapp import template # twitter.Api.__init__ method for override. def twitter_api_init_gae(self, username=None, password=None, input_encoding=None, request_headers=None): import urllib2 from twitter import Api self._cache = None self._urllib = urllib2 self._cache_timeout = Api.DEFAULT_CACHE_TIMEOUT self._InitializeRequestHeaders(request_headers) self._InitializeUserAgent() self._InitializeDefaultParameters() self._input_encoding = input_encoding self.SetCredentials(username, password) # 天気用に追加 # from urllib2 import urlopen # from xml.dom.minidom import parseString # from xml.etree.ElementTree import * # information = [] # io = urlopen("http://www.google.com/ig/api?weather=Tokyo") # dom = ElementTree(file=io) # cond = dom.find("//current_conditions") # for name in ["condition","temp_c","humidity","wind_condition"]: # information.append(cond.find(name).get("data")) # overriding API __init__ twitter.Api.__init__ = twitter_api_init_gae list = [ u"ante" ,u"Do my best" ,u"piyopiyopiyo" ,u"piyopiyo" ,u"ponyo" ,u"piyo" ,u"my name is anteroom" # ,u"Today's weather is " + information[0] # ,u"Today's weather is " + information[1] # ,u"Today's weather is " + information[2] # ,u"Today's weather is " + information[3] ] post = random.choice(list) api = twitter.Api("hoge","hoge") api.PostUpdate(post)

  • データモデル

    図書館の予約システムの一部について、次のようなデータモデルを作成した。 [予約システムのデータモデル] (利用者)1対多(予約)多対1(図書タイトル)1対多(所属図書) 利用者(利用者ID←主キー、利用者名、住所) 予約(利用者ID←主キー、図書タイトルID、予約日) 図書タイトル(図書タイトルID←主キー、分類コード、署名、著者) 所蔵図書(所蔵図書ID←主キー、図書タイトルID、購入日、累計貸出回数) 図書タイトルと所蔵図書は、「1対多」の関係です。したがって、これを分けずに1つのエンティティで表した場合は、以下のようになります。 図書タイトルID|分類コード|署名|著者|所蔵図書ID|購入日|累計貸出回数 KB0100|K01|工事X|井橋太郎|K0001|2002.12.01|5 CH1000|C02|情報A|市川五郎|C0001|2003.10.01|10 CH1000|C02|情報A|市川五郎|C0002|2003.10.01|13 CH1000~市川五郎のように、これでは、同一タイトルの図書が複数存在し冗長なので、共通する属性を抜き出し、新たな図書タイトルエンティティを作成します。つまり、図書タイトルエンティティは、物理的な実体をもつ所蔵図書エンティティの属性を抜き出した、実体を伴わない抽象的なエンティティとなります。 以上のような解説があるのですが、「物理的な実体をもつ」「もたない」とは、どういう意味なのでしょうか?ここでいう実体とは、何のことなのでしょうか?

  • SQL文について

    お世話になります。 POST通信で受け取った内容をデータベースに書き込もうとすると 書き込みに失敗してしまいます。 namespace portfolio; require_once dirname(__FILE__) . '/Bootstrap.class.php'; use portfolio\lib\Database; $db = new Database( Bootstrap::DB_HOST, Bootstrap::DB_USER, Bootstrap::DB_PASS, Bootstrap::DB_NAME); if($_POST !== false){ $dataArr = $_POST; $problem = $dataArr['problem']; $name1 = $dataArr['name1']; $name2 = $dataArr['name2']; $name3 = $dataArr['name3']; $name4 = $dataArr['name4']; } $sql = "INSERT INTO hokuto_problem (problem,name1,name2,name3,name4) VALUES (".$problem.",".$name1.",".$name2.",".$name3.",".$name4.")"; $res = $db->execute($sql); var_dump($res); if($res === true){ echo "処理が成功しました"; }else{ echo "書き込みに失敗しました"; } 上記処理をしようとしたら書き込みに失敗してしまいます Bootstrap.phpでは namespace portfolio; require_once dirname(__FILE__) . './../vendor/autoload.php'; class Bootstrap{ const DB_HOST = 'localhost'; const DB_NAME = 'hokuto'; const DB_USER = 'root'; const DB_PASS = 'root'; const APP_DIR = '/Applications/MAMP/htdocs/DT/'; // const TEMPLATE_DIR = self::APP_DIR.'templates/member/'; const CACHE_DIR = false ; const APP_URL = 'http://localhost:8888/DT/'; const ENTRY_URL = self::APP_URL . 'portfolio/'; public static function loadClass($class){ $path = str_replace('\\', '/', self::APP_DIR . $class . '.class.php'); require_once $path; } } spl_autoload_register( [ 'portfolio\Bootstrap', 'loadClass' ] ); そして、Database.class.phpにおいては amespace portfolio\lib; class Database { public $db_con = null; public $db_host = ''; public $db_user = ''; public $db_pass = ''; public $db_name = ''; public function __construct($db_host, $db_user, $db_pass, $db_name) { $this->db_con = $this->connectDB($db_host, $db_user, $db_pass, $db_name); $this->db_host = $db_host; $this->db_user = $db_user; $this->db_pass = $db_pass; $this->db_name = $db_name; } private function connectDB($db_host, $db_user, $db_pass, $db_name) { $tmp_con = mysqli_connect($db_host, $db_user, $db_pass, $db_name); if ($tmp_con !== false) { return $tmp_con; } else { printf("Connect failed: %s\n", mysqli_connect_error()); exit(); } } public function execute($sql) { return mysqli_query($this->db_con, $sql); } のコードを書いています 初心者に質問で、非常に見辛い面は承知の上で 大変心苦しいですが、何卒、ご回答いただけると幸いです

    • 締切済み
    • PHP
  • jquery codeigniterからデータ取得し表示する

    こんばんは。jquery初心者ですので、説明不足があればご指示ください。 codeigniterとjqueryを利用しています。 下記、class="name1"とclass="email1"のデータを、test/test2に渡し、 aaaで値を受け取っています。 受取る値が、Arrayと出ますが、それを表にする場合、どのようにすればいいのでしょうか? 【希望する表示】*例えばtableにする場合 <table> <tr> <td>担当者</td><td>名前</td><td>会社名</td> </tr> ~ここからデータ分ループ?~ <tr> <td>tantosha</td><td>name_jp</td><td>kaishamei</td> </tr> ~ここまでデータ分ループ?~ </table> 【jquery側】 $(".test").click(function(){ var serial = $('.name1').serialize() + '&' + $('.email1').serialize(); $.post("test/test2", serial, function(aaa){ alert(aaa);→分からないので、今はこうしてます^^ }); }); 【codeigniter側】 function test2(){ $a_name = $this->input->post('name1'); $email1 = $this->input->post('email1'); $this->db->select('tantosha'); $this->db->select('name_jp'); $this->db->select('kaishamei'); $this->db->from('テーブル名'); $where = "name_en like '%".$a_name."%' || email1 = '".$email1."'"; $this->db->where($where); $query = $this->db->get(); echo $query->result();

  • どうしても削除できないファイルがあるのです

    ワームに進入され、rootユーザーでもどうしても削除できないファイルがあります。 chattr コマンドで全ての属性を外しても駄目。 ファイル名の変更(mv)は出来ません。 パーミッションやオーナー・所属グループの変更は出来ます。 echo XX > fikename で上書きは可能。 このファイルを lsof で確認しましたが開いているプロセスはありません。 何が考えられるでしょうか? 「危険だから再インストールしなさい」という回答は不要です。 (検索するとこういう答えばかりでした) 既にネットワーク上から切り離してスタンドアロン状態です。 また、感染したコマンドなども復旧させMD5チェックサムも確認済みです。 ワームの一部のファイルだけがどうしても削除できないのです。 どのような可能性が考えられるでしょうか?

  • カラムの関係が多対多の場合の集計方法

    ページ名 | ユーザID mypage | 2 other | 2 other | 4 mypage | 2 index | -1 index | -1 mypage | 2 other | 3 other | 2 mypage | 2 index | -1 index | 3 上記のテーブルのように、ページ名とユーザIDが多対多のような関係になっている時に、 各ページにアクセスしてきたユニークユーザ数を取得したいと考えております。 上記の例ですと、求めたい答えは下記となります。 mypage:1 アクセスしたユーザは、2だけなので、ユニーク数は1 index:2 アクセスしたユーザは、-1と3なので、ユニーク数は2 other:3 アクセスしたユーザは、2と3と4なので、ユニーク数は3 group byで分けて集計すれば良いと単純に考えたのですが、 selectの対象は、group by の対象で無ければならないみたく、 どのように集計すれば良いのか、とても困っております。 大変申し訳ありませんが、ご教授願えませんでしょうか? 宜しくお願い申し上げます。

  • アクセスのデータが一件文字化けし削除できません

    文字化けデータを削除しようとすると「レコードに検索キーが見つかりませんでした」「引数が無効です」「他のユーザーが同じデータに対して同時に変更を試みているのでプロセスが停止しました」と表示され、削除できません。数人で同じDBを使用していますが、この作業をしているときはひとりだけで操作をしていました。 このテーブルをエキスポートしようとしても、このひとつの文字化けしたデータの為かは不明ですが「引数が無効です」とエラーになってしまいます。どうしたらよいでしょうか?

  • 1対多結合で多を絞り込み条件とするSQLについて

    1対多で結合する場合に、多が絞り込み条件となった場合のSQLについての質問です。 たとえばカスタムテーブルを使ったSELECT文などで、このような絞り込み条件が必要になると思います。 まずカスタムテーブルの具体例として、たとえばユーザーテーブルがあったとします。 [user_table] id=INT //オートインクリメント user_id=VARCHAR //adminなどのユーザーID文字列 user_pass=VARCHAR //パスワードを保存※ハッシュ化した値 user_name=VARCHAR //山田太郎などのユーザー名 user_mail=VARCHAR //ユーザーのメールアドレス user_description=TEXT //ユーザーの自己紹介文 user_created=DATETIME //ユーザーの登録日 とりあえず、上記のようなデータをユーザーの基本データだとします。 このユーザーテーブルから、たとえば名前を元に検索するのは単純です。 たとえばこのような感じでしょうか。 SELECT * FROM user_table WHERE user_name = '山田太郎' このテーブル構造を変更することなくカスタムデータを追加したい(しかも柔軟に)という要望を実現するために、ユーザーカスタムテーブルを作ったとします。 [user_custom_table] id=INT //オートインクリメント relational_id=INT //user_table.idへの参照 custom_name=VARCHAR //カスタムフィールド名 custom_value=VARCHAR //カスタムフィールドの値 custom_name、custom_valueには、たとえばそれぞれ以下のような値が入るとします。 custom_name、custom_value Birthday 、1998/1/1 CompanyName 、○○株式会社 CompanyTel、000-0000-0000 CompanyAddress、東京都千代田区○○-○○ user_custom_table.relational_idはuser_table.idにリレーションしているとすると、INNER JOINして値を取得する方法は判ります。 ※カスタムテーブルに値がない場合という状況は無視できる仕様です。 たとえば、会社住所が東京都で始まるユーザのみを抽出すると、以下のような感じでしょうか。 SELECT user_table.* FROM user_table INNER JOIN user_custom_table ON user_table.id = user_custom_table.relational_id WHERE user_custom_table.custom_name = 'CompanyAddress' AND user_custom_table.custom_value LIKE '東京都%' ただ、この方法だと、誕生日が○月○日以前で、会社名に○○を含んで、会社住所が東京都で始まり…と検索条件が増えていった場合にINNER JOINがどんどん増えていって、いかにも効率が悪いと思えてなりません。 とりあえず適当に書いてみるとして、以下のような感じでしょうか。 SELECT user_table.* FROM user_table INNER JOIN user_custom_table AS custom_1 ON user_table.id = custom_1.relational_id INNER JOIN user_custom_table AS custom_2 ON user_table.id = custom_2.relational_id INNER JOIN user_custom_table AS custom_3 ON user_table.id = custom_3.relational_id WHERE custom_1.custom_name = 'CompanyAddress' AND custom_1.custom_value LIKE '東京都%' AND custom_2.custom_name = 'Birthday' AND custom_2.custom_value < '2001/1/1' AND custom_3.custom_name = 'CompanyName' AND custom_3.custom_value LIKE '%○○%' もっと効率の良い書き方、一般的にはこういう場面ではこんな書き方をするなど、識者の方から教えを請いたくて質問しました。 ※ちなみにDBはMySQLですが、とくにMySQLに限らない方法で答えを頂ける方がありがたいです。

    • ベストアンサー
    • MySQL
  • PEARを使ったフェッチのしかた。

    いつもお世話になっています。 pear と phpを使ったclassを勉強しており 行き詰った点があったので教えてください。 **** class.php ************************ require_once("DB.php"); class DB_Class{ var $db_object;//DB::connectが入る var $db = "mysql"; var $db_user = "user"; var $db_host = "localhost"; var $db_name = "db_name"; var $pass = "pass"; function DB_Class(){ //コンストラクタ $db_string = $this->db."://".$this->db_user.":".$pass."@".$this->db_host."/".$this->db_name; $this->db_object = DB::connect($db_string); } } **** test.php ******************************** require_once("class.php"); $obj = new DB_Class(); $sql = "select * from TEST_TABLE"; $res = $obj->db_object->query($sql); while($row =$res->fetchRow(DB_FETCHMODE_ASSOC)){ print("<td>".$row["TEST"]."</td>"); } class.phpファイルのメンバ変数 var $db_objectにDB::connectが入っており、 test.phpでfetchRowを使ってDBの内容を 取り出したいのですが、 fetchRowメソッドが見つからないというエラー がでます。 それまでのqueryメソッドまではエラーがなく 呼び出せます。 while($row =$res->fetchRow(DB_FETCHMODE_ASSOC)) ここを $res->$obj->db_object->fetchRowや $res->$obj->$this->DB_object->fetchRowや とにかく色々な方法を試してみたのですが うまくいきませんでした。 どなたかご教授お願い致します。

    • ベストアンサー
    • PHP
このQ&Aのポイント
  • 接客業で働く40代女性が困っているおじいさんの問題について解説します。
  • おじいさんの異常な行動やストーカー的なアプローチによってストレスを感じている状況を説明します。
  • このような場合、断り方や対処法、上司への相談などを考える必要があります。
回答を見る

専門家に質問してみよう