愚痴というか、悩みというか、反省談というか。
いま作っているシステムでは、lmdbというKey-Value Storeのデータベースを使っている。
というといろいろ考えて選択したように見えるが、
- SQL使うほどでも無い
- C言語で使えるもの
- よく使われている
というところで選んだだけだ。
そもそも、私はストレージが使えない組み込みシステムをやることが多かったので、DB自体くわしくない。
lmdbは、NoSQLと呼ばれる類のDBらしい。
https://ja.wikipedia.org/wiki/NoSQL
DBという全体集合があり、その部分集合としてSQL DBがある。
そして、NoSQLは、その反転した集合になりそうな気がするのだが、Wikipediaに書いてある"Not only SQL"が語源だとするならば、SQLを含んでいてもよいし、含まなくてもよい、ということになりそうだ。
lmdbは、SQL文は使わない。
DBの要素としては、こういうものがある。
- environment
- DB
- key
- data
まず、environmentという大きな広場があり、その中にDBを複数持つことができる。
そして、DBの中にkey-dataのセットでデータが格納されていく。
「トランザクション」というアクセス単位は、environment単位になる。
これに気付かなくてねぇ・・・。
トランザクションってDB単位でやるものだろうと思い込んでいたので、DBのオープンAPIにトランザクションが必要だとわかったときはショックだったわ。
イメージとしては、ドライブとディレクトリみたいなものか。
environmentがドライブで、DBがディレクトリ。
そして、ロックを掛けられるのはドライブ単位だ、と。
どうしても同時にロックしたくて、でもシステム上うまいことやれそうにないなら、environment自体を分けてしまうしかない。
システムを作って半年以上あれこれいじっているが、設計がよくなかったのか、lmdb以外だったらうまくやれたのか、未だによくわかっていない。
結局、environmentを分けることで対応したのだが、未だにどうするのがよかったのか、あるいはどうする方がよいのか、私の中で結論が出ていない。
SQLとかリレーショナルとか、そういう関連性がないということだけはわかっている。
そして、C言語から使いたい。
あとはメンテナンスされていっているとか、枯れているとか、そのくらいか。
https://ja.wikipedia.org/wiki/NoSQL
https://en.wikipedia.org/wiki/NoSQL
うーん、jaとenのWikipediaを並べてみたのだが、内容はともかく、数が多い!
これだけあるということは、特色がそれぞれあって、望む形はいろいろあるということなのか・・・。
「Aである」という事象はAだけだが、「Aではない」という事象は無限にあるのと同じか。
つまり、私が"lmdbでよかったんだろうか"という悩みは、ある意味では当然のことというわけだ。
無限にあるものの中から正解を1つだけ見つける、ということはあり得ないからだ。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。