3、建造Mnesia数据库
3.1 定义数据库结构
3.1.1 与数据库结构相关的函数
● mnesia:create_schema(NodeList).
用于初始化新建的空白的结构。它必须在Mnesia启动前调用。
● mnesia:delete_schema(DiscNodeList).
它清除在列表DiscNodeList中的全部节点上的已有数据库结构及其数据表格。它调用前必须在全部db_nodes上停用Mnesia。
● mnesia:delete_table(Tab).
永久删除表格Tab的复制品。
● mnesia:clear_table(Tab).
永久删除表格Tab的内容。
● mnesia:move_table_copy(Tab, From, To).
把表格Tab的复制品,从节点From移至节点To。
● mnesia:add_table_copy(Tab, Node, Type).
在节点Node创建表格Tab的复制品。
● mnesia:del_table_copy(Tab, Node).
在节点Node删除表格Tab的复制品。
● mnesia:transform_table(Tab, Fun, NewAttributeList, NewRecordName).
改变表格Tab中定义的记录格式。参数Fun表示处理表中全部记录的函数。
-record(old, {key, val}).
-record(new, {key, val, extra}).
Transformer =
fun(X) when record(X, old) ->
#new{key = X#old.key,
val = X#old.val,
extra = 42}
end,
{atomic, ok} = mnesia:transform_table(foo, Transformer,
record_info(fields, new),
new),
● change_table_copy_type(Tab, Node, ToType).
改变表格的存储类型。例如,在节点Node上,内存表格RAM改为硬盘表格disc_table。
3.2 数据模型
Mnesia的数据模型是扩展的关系数据模型。数据组成表格的集合,数据记录之间的关系,可由表格间的关系模型描述。表格内容是Erlang记录的实例,记录由Erlang元组的形式表示。
3.3 启动Mnesia
启动Mnesia之前,必须初始化各相关节点上的数据库结构为空白。
● Erlang系统必须启动;
● 必须用函数create_schema(NodeList),在硬盘数据库相关节点上,定义数据库结构。
3.3.1 初始化数据库结构,启动Mnesia
我们以上述数据库Company为例:
%erl -mnesia dir '"/ldisc/scratch/Mnesia.Company"'
初始化数据库:
dist_init() ->
mnesia:create_table(employee,
[{ram_copies, [a@gin, b@skeppet]},
{attributes, record_info(fields,
employee)}]),
mnesia:create_table(dept,
[{ram_copies, [a@gin, b@skeppet]},
{attributes, record_info(fields, dept)}]),
mnesia:create_table(project,
[{ram_copies, [a@gin, b@skeppet]},
{attributes, record_info(fields, project)}]),
mnesia:create_table(manager, [{type, bag},
{ram_copies, [a@gin, b@skeppet]},
{attributes, record_info(fields,
manager)}]),
mnesia:create_table(at_dep,
[{ram_copies, [a@gin, b@skeppet]},
{attributes, record_info(fields, at_dep)}]),
mnesia:create_table(in_proj,
[{type, bag},
{ram_copies, [a@gin, b@skeppet]},
{attributes, record_info(fields, in_proj)}]).
函数 mnesia:stop() 在本地节点上停止 Mnesia。函数 start/0 和 stop/0 工作在本地 Mnesia 系统上。
3.3.2 启动顺序
Mnesia 的启动函数是:
mnesia:start().
它初始化本地的 DBMS。
不同的配置会改变表格位置和装入顺序。
函数mnesia:wait_for_tables(TabList, Timeout) 推迟对表格的访问,直到TabList中指定的表格做了适当初始化。
下面的函数可以把硬盘上的全部表格快速装入内存:
mnesia:force_load_table(Tab).
3.4 创建新表格
mnesia:create_table(Name, ArgList).
函数执行后的返回信息:
{atomic, ok} 函数成功执行
{aborted, Reason} 执行失败
函数的参数:
Name 是表格的原子名称。
ArgList 是列表,表成员是 {Key,Value} 元组。
假设有个记录的定义:
-record(funky, {x, y}).
下面创建表格,要在2个节点上复制,在属性y上有附加索引,并且是个类型包(type bag)。
mnesia:create_table(funky, [{disc_copies, [N1, N2]}, {index,
[y]}, {type, bag}, {attributes, record_info(fields, funky)}]).