MySQLデータベースによるSchemalessのデータベース・ストレージ・スキームのサポート


PyConでは子供靴が似たような概念の共有を提供していますが、一般的なタイプのインターネットプロジェクトにはあまり向いていません.ちょっと変わった感じがします.しかし、私がこの案を実現したのはPyConの共有を見る前にです.同じ訴えが違う実現方法だろう.ここでは、サーバではなくデータ・アクセスを実現するコンポーネントにすぎません.
まず、この方法は、MySQLデータベースの共有方法をFriendFeedが共有する方法から来ています.簡単に言えば、Pythonオブジェクトを直接dumps後zip圧縮してMySQLのフィールドに格納します.これでSchemalessじゃないの?どのようなデータ型、クラス、どのような構造を保存するか、MySQLは知る必要はありません.属性を加える必要はありません.データベースのテーブル構造を変更する必要はありません.ビジネスが急速に変更され、急速に成長しているインターネットビジネスには最適です.アクセス・オブジェクトは、プライマリ・キー・クエリーを直接通過し、迅速に直接実行されます.but、クエリーはどうしますか?ある子供靴は聞くかもしれません.OK、検索の得点は2つありますが、簡単な検索であれば、インデックステーブルを作ることで解決したり、lucentのような外部のインデックスで全文検索したりすることができますよ.今、目の前で私はインデックステーブルのインデックス方式を実現しました.外部のインデックス方式は奇妙なので、具体的な状況に応じて自分で書くことができます.どうせ対応するいくつかの方法を実現すればいいです.
前の例に直接説明します.一つのblogを実現するには、blogの情報を保存する必要があると仮定し、まずblogのモデルクラスを定義します(importが必要です.
1 class Blog(DynamicBase):
2     title=Column(unicode,max_length=200)
3     content=Column(unicode)
4     post_date=Column(datetime.datetime,db_index=True)
5     auther=FkColumn(User)
6     class Meta:
7         table_name="blogs"
8         connection=connections[DB]

この接続は、Djangoにシームレスに結合してDjangoから独立して使用できる一時的な措置を両立させる方法をまだ考えていないので、完成版は削除されます.
djangoを使用している場合はpython manageしか必要ありません.そしてブロガーobjects.create_table()
モデル定義のテーブルとインデックステーブルが自動的に作成されます
データテーブルblogs:
CREATE TABLE `blogs` ( `id` int(11) NOT NULL, `object` varbinary(20000) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2つのインデックステーブルを同時に作成
CREATE TABLE `blog_idx_post_date` ( `id` int(10) unsigned NOT NULL, `post_date` DATETIME NOT NULL, PRIMARY KEY (`id`), INDEX `idx_blogs_by_post_date` (`post_date`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
CREATE TABLE `blog_idx_auther` ( `id` int(10) unsigned NOT NULL, `auther` INT NOT NULL, PRIMARY KEY (`id`), INDEX `idx_blogs_by_auther` (`auther`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
この時、Blogを通ることができます.objects.create(title=u「タイトル」、content=u「コンテンツ」、post_date=datetime.datetime.now()、auther=user)、またはBlog.objects.create(title=u「タイトル」、content=u「コンテンツ」、post_date=datetime.datetime.now()、auther=user.id)
Blogのオブジェクトを作成できます.このときblogsテーブルと2つのインデックステーブルにデータが挿入されます.しかしblogs表のobject列は人間には理解できない火星文......
idによりオブジェクトBlogを直接取得する.objects.get(1)は、インデックスからBlogを取得する.objects.auther.query(auther=user.id)またはBlog.objects.auther.query(auther=user)
これはSQL、SELECT`id`FROM`blog_を生成しますidx_auther`WHERE`auther`=%s次にmatchをオブジェクトのidリストに取り出し、idリストを巡りBlogを通過する.objects.get(id)で取得したオブジェクトのリスト.
Blog.objects.get(id)の場合はオブジェクトキャッシュがある(現段階ではredisで実現)ので、テストを経て速度は頼りになります.一方、MangoDBに比べてMySQLのデータストレージもより頼りになるので、今でもあまり頼りにならないmangodbをメインストレージとして使うよりも、MySQLベースのSchemalessスキームの方が頼りになります.
 
まだプロジェクトで孵化している段階なので、独立して娯楽を提供できるレベルには達していません.この案についてアドバイスしてください.ソースコードは春節後に公開できる段階に達すると思います.