やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

はてなアカウントDBを作る

SQLite3で。

開発環境

はてなブログAtomPub - Hatena Developer Center

成果物

GitHubHatena.Blog.API.Database.Create.Accounts.201703010822

前回

http://ytyaru.hatenablog.com/entry/2017/06/26

結局、DBは以下の4つに分けることにした。

DB 分けた理由
Accounts プライベート情報のため。
Blogs Accountsに入れるには公開情報なので不一致。Entriesに入れるには特定ブログでなく自分が所持する全アカウントの全ブログなので不一致。データ量が少ないが仕方なく分けた。
Entries.{BlogId} 特定ブログの全記事を管理したいため。
PhotoLife.Images.{HatenaId} ファイルサイズが大きいため。特定アカウントの全画像データを管理したいため。
PhotoLife.Movies.{HatenaId} ファイルサイズが大きいため。特定アカウントの全動画データを管理したいため。

PhotoLifeはバイナリデータでサイズも大きいため別ファイルにする。はてなの仕様でアカウントごとに毎月300MBまでなのでアカウント別に管理する。

懸念

ファイルサイズの最大値を超えないか心配。32bit版OSの場合、Windowsだと1ファイルの最大サイズが4GBだった。

ext4だと16TiBまで可能らしい。それなら十分足りるだろう。ext4でフォーマットしたはずだからそうだと思うが、試していないので本当にそうなのか不明。

Linuxファイルシステムをまとめてみました - Qiita
http://ips.nekotype.com/988/

データベース

SQLite3で管理する。以下のファイルとして作成する。

  • Hatena.Accounts.sqlite3

テーブル

Accounts

create table Accounts(
    Id          integer primary key,
    HatenaId    text unique not null,
    Password    text not null,
    MailAddress text unique not null,
    Nickname    text not null,
    Created     text
);
  • HatenaIdとMailAddressは重複不可と思われる
  • Nicknameは重複可かもしれないが未調査。念の為DB上では重複可とする

OAuthApplications

create table OAuthApplications( Id integer primary key, AccountId integer not null, Name text not null, Description text, Url text not null, Logo blob, Icon blob, ConsumerKey text not null, ConsumerSecret text not null, AccessToken text, AccessTokenSecret text, Scopes text, CreateAt text, Status integer not null default 1 check(Status = 0 or Status = 1), NumberOfCertifiers integer not null default 0, FOREIGN KEY (AccountId) REFERENCES Accounts(Id) );

Accountsの子テーブルなので外部キーを設定する。

  • Nameのデフォルト値ははてなID
  • URLのデフォルト値はhttps://www.hatena.ne.jp/{はてなID}/
  • Scopesの値は、read_public、write_public、read_private、write_privateをカンマ区切りにした組合せ。ないときはNULLまたは空文字。
  • AccessTokenは取得手順を踏む必要がある

APIを使うだけなら不要な値も多いが、とりあえず管理ページにある値を含めておく。無理に使わなくてもいい。項目の順序も管理ページに従っている。

デフォルト値はDBの制約だけでは設定できない。データを挿入するときにどうにかするしかない。

所感

はてなAPIの細かい仕様やファイルシステムなどわかっていないことが多い。とりあえずざっくり作ってしまう。

アカウント情報を取得するAPIはないと思う。手動でDBに挿入するしかない。面倒。