2011-03-31 6 views
0

私はちょうど1つの目的に合った特別なデータベースを書くというアイデアに出会った。私はいくつかの他のデータベースシステムを調べ、カスタムタイプが必要であるという結論に達しました。しかし、私の質問はそれが良いアイデアかどうかについてではなく、このベストを実装する方法です。カスタムデータベースサーバ(PHP)にとって最も効果的な方法を見つけ出す

アプリケーション自体はPHPで書かれており、カスタムデータベースシステムに書き込む必要があります。 読み込み/書き込みの同時実行が可能なので、アプリケーションに直接データベースを実装するという考え方は忘れてしまいます。 (私が間違っていれば私を修正してください)。

  1. データベース・サーバー・スクリプト
  2. アプリケーション:私は2つのスクリプトを作成しなければならないことを意味

これは、アプリケーションがサーバーと通信する必要があることを意味します。私の考えは、データベースサーバ用のcliモードでPHPを使用していました。問題は、これが有効な場合、またはC++のようなプログラミング言語を調べてサーバーアプリケーションを開発する必要がある場合です。 2番目の質問はコミュニケーションです。 cliモードでphpを使用する場合、私は直列化された配列クエリをparamとして与えることを考えました。私はそれをシリアル化する必要がありますか?または、おそらくjsonで、または何でも?

検索対象のデータベースは、数千ものエントリで構成されています。だから私は正確にPHPが本当に正しい選択であるか分からない。 第2に、クエリは、解析する必要がある文字列ではなく、キー、値フィルタまたはデータセットを与える配列であることに注意する必要があります。データベースサーバが可能でなければならない多分複雑なことは、MySQL版のLIKE '%VALUE%'のような文字列を比較することです。これは数千のエントリで遅くなる可能性があります。

ありがとうございました。正確に一つの目的のために収まる特殊なデータベースを書い

+1

特に、PHPを使用して独自のデータベースを作成することをお勧めしません。データベースは非常に大きく、複雑なソフトウェアです。あなたのユースケースは何ですか?いくつかの選択肢をお勧めします。 – chriso

+0

あなた自身のデータベースサーバを書く方法が不思議なら、あなたは本当にそれを書こうと思っていません。あなたはまだそれを知らないだけです。 – Archimedix

+0

私はDatasbesとTableを通常のデータベースのように持っています。しかし、私は列がありません。各エントリは、id以外の独自の列を持つことができます。私はmysqlのIDを使用することができます|シリアル化されたデータ...しかし、エントリ内の特定のパラメータを検索することは非常に楽しいです。 –

答えて

0

私は、カスタムデータベース管理システム、

私はundertanding多くの問題を抱えていることを意味推測なぜこれが今まででしょう必要になる。

通常のデータベースと同様のデータバスとテーブルがあります。しかし、私は列がありません。各エントリには、痛みや多大の努力を介して自分自身(およびユーザー)を置くための非常に良い理由ではないのID

を除いて、独自の列を持つことができます。

私はmysql id |エントリーで特定のパラメータを介して検索するシリアル化されたデータ...が、その後多くの楽しみ

だから、リレーショナルデータベースの上に実装完全に多型モデルと間違って何:...

CREATE TABLE relation (
    id INTEGER NOT NULL auto_increment, 
    .... 
    PRIMARY KEY (id) 
); 
CREATE TABLE col_string (
    relation_id NOT NULL /* references relation.id */ 
    name VARCHAR(20), 
    val_string VARCHAR(40), 
    PRIMARY KEY (relation_id, name) 
); 
CREATE TABLE col_integer (
    relation_id NOT NULL /* references relation.id */ 
    name VARCHAR(20), 
    val_integer INTEGER, 
    PRIMARY KEY (relation_id, name) 
); 
CREATE TABLE col_float (
    relation_id NOT NULL /* references relation.id */ 
    name VARCHAR(20), 
    val_float INTEGER, 
    PRIMARY KEY (relation_id, name) 
); 

とBLOB、DATEなどのテーブル

スケーラビリティが大きな問題ではない場合は....

CREATE TABLE all_cols (
    relation_id NOT NULL /* references relation.id */ 
    name VARCHAR(20), 
    ctype ENUM('string','integer','float',...), 
    val_string VARCHAR(40), 
    val_integer INTEGER, 
    val_float INTEGER, 
    ... 
    PRIMARY KEY (relation_id, name) 
); 

はい、挿入と選択「の行は、」通常のリレーショナル表のためのより複雑である - しかし、最初から独自のDBMSを書くよりもずっと簡単。また、ストアドプロシージャのほとんどの機能をラップすることができます。説明された方法は、NoSQLデータベースにも簡単にマッピングされます。