記号の意味:
	×1 は、その属性を必ず1つだけ持つことを意味する
		primary key は、必ず ×1 となる。
	×0〜1 は、その属性を1つ持つことがある(optional)を意味する
	×0〜N は、その属性を複数(0以上)持ちうることを意味する
	×1〜N は、その属性を複数(1以上)持ちうることを意味する

	(PK) … primary key
	(FK) … foregin key
	(IE) … inversion entry (索引づけ候補)

	[CI] … case insensitive な文字列
		この注釈のない文字列は case sensitive

------------------------------------------------------------------------

gfarm-2.x のスキーマ (論理設計寄り)

実体: Host
	属性:	hostname: 文字列 [CI], ×1 (PK)
		architecture: 文字列, ×1 (IE)
		ncpu: 整数, ×1
			ncpu == 0 のマシンは、CPU を提供せず、
			ディスクサーバーとしてのみ動作させる。
			そういうマシンでは、gfrcmd も許さない。
		port: 整数, ×1
			gfsd のポート番号
		hasDisk: 真偽値, ×1
			ディスク領域を提供することを示す。
			gfarm-2.x の当初のバージョンではは常に 1 を予定。
	関連:
		- 「ホスト名か別名を持つ」参照
		- 「レプリカを保持する」参照

実体: HostNameAlias
	属性:	hostnamealias: 文字列 [CI], ×1 (PK)
			ここには、hostname と hostalias を両方登録する
		hostname: 文字列 [CI], ×1 (FK) (IE)
	関連:
		- ホスト名か別名を持つ:
		  Host(hostname) : HostNameAliases(hostname) = 1 : 1〜N

実体: User
	属性:	username: 文字列, ×1 (PK)
		userRealName: 文字列, ×1
		gfarmHomeDir: 文字列, ×1
		gsiDN: 文字列, ×0〜1 (IE)
	関連:
		- 「グループに属する」参照
		- 「INode のオーナー」参照

実体: Group
	属性:	groupname: 文字列, ×1 (PK)
	関連:
		- 「ユーザーを含む」参照
		- 「Inode のグループ」参照
	※ groupname=="gfadmin" を管理者権限を持つグループとする

関連実体: GroupAssignment
	属性:	username: 文字列, ×1 (PK) (FK)
		groupname: 文字列, ×1 (PK) (FK)
	関連:
		- グループに属する:
		  User(username) : GroupAssignment(username) = 1 : 1〜N
		- ユーザーを含む:
		  Group(groupname) : GroupAssignment(groupname) = 1 : 0〜N

実体: INode (mode の値によって、サブタイプ DirINode, FileINode に分類)
	属性:	inode: 数字, ×1 (PK)
			inode==2 を root directory とする。
		mode: 整数, ×1
		username: 文字列, ×1 (FK)
		groupname: 文字列, ×1 (FK)
		atimesec: 整数, ×1
		atimensec: 整数, ×1
		mtimesec: 整数, ×1
		mtimensec: 整数, ×1
		ctimesec: 整数, ×1
		ctimensec: 整数, ×1
	関連:
		- INode のオーナー:
		  INode(username) : User(username) = 0〜N : 1 
		- INode のグループ:
		  INode(groupname) : Group(groupname) = 0〜N : 1 
		- 「パス名が指す」参照
	※ 物理設計での変更点
	    属性の追加:
	      DirINode の場合と FileInode の場合の両方
		nlink: 整数, ×1
			ハードリンク数。すなわち関連「パス名が指す」の数。
		generation:  整数, ×1
			世代番号、すなわち inode 番号が再利用された回数。
	      FileINode の場合、
		filesize: 整数, ×1
		checksumType: 文字列, ×1
		checksum: 文字列, ×1
	    関連の移動:
	      DirINode の場合、
		- 「ディレクトリに所属する」参照
	      FileINode の場合、
		- 「レプリカの所在」参照

	※ ディスク容量節約のため、RDB 用の SQL スキーマでは、省略可能な
	   checksumType, checksum は、別テーブル FileInfo に追い出す。

	※ 将来的に、下記の属性を追加した方が良いと思われる。
		desiredCopies: 整数, ×1
			期待されるレプリカの数。
			DirINode の場合と FileInode の場合の両方で用いられる。
			ディレクトリの場合は、その直下に作られる
			ファイル/ディレクトリの desiredCopies の初期値として
			使われる。デフォールトは 1。
		ncopies: 整数, ×0〜1
			FileInode 用。
			有効な (valid==真である) FileCopy の数 (レプリカの数)。
			物理設計のみで用いる。導入の目的は性能向上。

実体: DirINode (INode のサブタイプ)
	属性:	なし
	関連:
		- 「ディレクトリに所属する」参照
	※ 物理設計での変更点
	    DirINode は廃止し、INode に統合する。
	    関連の移動:
		- 「ディレクトリに所属する」参照

実体: FileINode (INode のサブタイプ)
	属性:	filesize: 整数, ×1
		checksumType: 文字列, ×1
		checksum: 文字列, ×1
	関連:	
		- 「レプリカの所在」参照
	※ 物理設計での変更点
	    FileINode は廃止し、INode に統合する。
	    属性の移動:
		FileInode の属性は INode で保持する。
		ただし、RDB 用の SQL スキーマでは、
		省略可能な checksumType, checksum は、
		別テーブル FileInfo に記録する。
	    関連の移動:
		- 「レプリカの所在」参照

関連実体: FileCopy
	属性:	inode: 数字, ×1 (PK)
		hostname: 文字列 [CI], ×1 (PK)
	関連:
		- レプリカの所在:
		  FileINode(inode) : FileCopy(inode) = 0〜1 : 1〜N
		- レプリカを保持する:
		  Host(hostname) : FileCopy(hostname) = 1 : 0〜N
	※ 物理設計での変更点
		- レプリカの所在:
		  FileINode(inode) : FileCopy(inode) = 0〜1 : 1〜N
		  は
		  INode(inode) : FileCopy(inode) = 0〜1 : 0〜N
		  となる。
		  FileCopy 側が 0 になるのは、INode がファイル以外の場合。

関連実体: DeadFileCopy
	属性:	inode: 数字, ×1 (PK)
		igen: 数字, ×1 (PK)
		hostname: 文字列 [CI], ×1 (PK)
	関連:
		- 古いレプリカの所在:
		  FileINode(inode) : DeadFileCopy(inode) = 0〜1 : 0〜N
		- 古いレプリカを保持する:
		  Host(hostname) : DeadFileCopy(hostname) = 1 : 0〜N
	※ 物理設計での変更点
		- 古いレプリカの所在:
		  FileINode(inode) : DeadFileCopy(inode) = 0〜1 : 0〜N
		  は
		  INode(inode) : DeadFileCopy(inode) = 0〜1 : 0〜N
		  となる。

関連実体: DirEntry
	属性:	dirINode: 数字, ×1 (PK) (FK)
			dirINode==1 を root directory とする。
		entryName: 文字列, ×1 (PK)
		entryINode: 数字, ×1 (FK)
			entryINode は 決して 1 (root directory) を指さない。

	関連:
		- ディレクトリに所属する:
		  DirINode(inode) : DirEntry(dirINode) = 1 : 0〜N
			DirEntry が 0 となるのは空ディレクトリの場合。
		- パス名が指す
		  DirEntry(entryINode) : INode(inode) = 0〜1 : 1 
			DirEntry が 0 となるのは root directory のみ。
			hardlink を許すなら DirEntry 側は、0〜N となる。
	※ 物理設計での変更点
	    関連の移動:
		- ディレクトリに所属する:
		  DirINode(inode) : DirEntry(dirINode) = 1 : 0〜N
		  は、
		  INode(inode) : DirEntry(dirINode) = 1 : 0〜N
		  となる。
		  DirEntry が 0 となる場合として、空ディレクトリの場合の
		  他に、その INode がディレクトリでない場合が増える。

実体: XAttr
        属性:   inumber: 数字, ×1 (PK)
                attrname: 文字列, ×1 (PK)
                attrvalue: バイナリ, ×1
        関連:

実体: XmlAttr
        属性:   inumber: 数字, ×1 (PK)
                attrname: 文字列, ×1 (PK)
                attrvalue: XML, ×1
        関連:

実体: SeqNum
        属性:   name: 文字列, ×1 (PK)
                value: 文字列, ×1
        関連:

TODO: ACL サポート
