データベースを作ってみたいです
MySQLやSQLiteのようなRDBMSを作ってみたいです。
参考になる書籍(教科書?)やWebサイトがあれば教えてくれませんか その程度のことを自分で探せないやつに作れないだろ。
いきなり高度なことをやろうとするとその設計をどうしたらいいか
分からず、途方にくれて終わるものだ。
まずはCSVファイルの操作を行うモジュール群を作ってみてはどうだ?
指定した行でソートするとか、指定した文字を含んだ行だけ取り出すとかが
出来るやつ。
いきなりSQL文の解析機能の実装をやろうなどという考えなどは捨てた方が良い。
CSVファイルに登録するデータも決めた物しかできないところからはじめる。
例) No, 名前, フリガナ, 性別, 郵便番号, 住所 sqlの解析自体は難しくない
字句解析とか構文解析でぐぐろう
実装は部分からでいい
monaのdb版の誕生に期待 >>5
>いきなり高度なことをやろうとするとその設計をどうしたらいいか
>分からず、途方にくれて終わるものだ。
そのとおりだと思います。有難う御座います。
CSVの操作ぐらいならできそうなのでISAMの実装なんかから始めたいなと思ってます。 >>6
SQLの部分ではなくデータ構造(?)のほうに興味があります
ISAM形式というのが基本っぽいのですがあってますでしょうか >>7
実用では考えていないので、LL系でいいかなと思っています。 >>1にとっては、そのソースを読むのは、急に高い崖を登るのに
近い行為となるだろう。(無理だと決め付けているという意味ではなくて)
まずは、データの保存や抽出をする部分をクラスにまとめて
使いやすくしたモジュールを提供するという考えで設計する
ところからやってみてはいかがだろうか。 俺は「SQL文を解析して実行」という事にこだわる必要も無いと
思うけどな。そうしたらSQLインジェクションに対抗できる
仕様設計だと考える事も出来るわけで。 >>1が何を考えてこのスレを立てたのかにもよると思うな。
RDBMSとか書いているけれど、テーブルを個別に管理できればそれで良いという考えなのか、
それともリレーションのところまでやるのか。
トランザクションやら、ストアド・プロシージャなどのイメージもあるのか。
ま、俺の場合は、個人で作るものであれば、リレーションは切り捨てるだろうな。
普段作るDBを使ったプログラムは、リレーションはクライアントのプログラムの方で
実現する事が多いから。だから、参照整合性とかの機能の実装にはあまり興味が無い。 VB.NET とかの世界だと、すでに mdbファイル & ADO.NET があるからなぁ。
PHP の世界だと、DBの構築をせずにデータの管理をしたい場合などで
一部使ってもらえるかもしれない。 >>1がイメージしているRDBMSってどんなものなんだろうな。
mdbみたいにファイルとして存在しているものにアクセスするだけで
いいのか。それとも、SQL Server みたいに、アプリとは別にソフトが
立ち上がっていて、それがデータの制御を行う形なのか。
また、ネットワークを通じて複数のアクセスがあるのにも対応できる
かどうかとかあるしね。
ISAMの実装に興味があるような事をいってたけど、そういう部分への
対応はどこまでイメージしているのかな? こんな感じで管理すると複数のDBを持つのにも対応出来そうだね。
DB名:ディレクトリ名
テーブル名:CSVファイル名
例:DBが「test1」で、その中にテーブル「t1」「t2」「t3」がある場合
/monadb/test1/t1.csv
/monadb/test1/t2.csv
/monadb/test1/t3.csv >>1は余り興味ないようだけど、独特な設計をしたSQL文という発想もいいかもしれないね。
MonaOSの設計思想はそういうところがあるからね。
多くのユーザに使ってもらえるかを優先的に考え、過去のしがらみにとらわれた物の
延長として考えるのではなく、本当に使いやすいものを、と考える。 処理効率が良いが、別に最適化が必要。
処理効率は悪いが、最適化は不要。
こういうのはどうなんだろ。 とにかく処理効率の速さにこだわったものという方向性は
辞めておいた方がいいのかな。その先にGoogleが居るからw
「処理効率は、ある程度良い」くらいw 他の人にアドバイスを貰うなら、
>CSVの操作ぐらいならできそうなのでISAMの実装なんかから始めたいなと思ってます。
ではなく、もう少し具体的なイメージを説明できた方がいい。
試しに自分が利用するシーンを想像して、
「こんな感じで検索を指示して、結果を配列に入れる」
「こんな感じで更新するデータと条件を準備して指示する」
なんてのが明確に出来た方がいい。
擬似的な利用例のスクリプトがあったりするといいかも。
##script(perl)
use MYDB;
my $db = MYDB->new('mydb/mydbsample.csv');
my @rows;
@rows = $db->select( 'num, key, val', "key='V1.0' and val<'100'" );
$db->close();
##mydb/mydbsample.csv
num,key,val
1,V1.0,150
2,V1.0,50
3,V1.1,120
4.V1.0,15
5,V1.1,20
なんて感じの。上はselectメソッドで key=V1.0 and val<100 な行を返してもらうことを想定。
>>1の考えていることを明確にしないと、助言・指摘をしたい/出来る人たちは説明に困っちゃうと思う。
>>1
エンジンとしてもっとも優れているのは BerkeleyDB でしょうね。
ただしテーブルもSQLもサポートしていません。
もちろんインデックスもです。
しかしリレーショナルデータベースを作るための要素は盛り込まれており
フリーで全ソース公開されています。
このソースを使ってエンジンの勉強をするか、
パーツを利用して独自のシステムを組み上げるとよいのではないでしょうか。
実用は考えていないらしいからなあ
カラクリを確認するのが目的なんだろうなあ
他の人はMonaDBを期待してるのかな?