从数据库创建模式时,不会创建表之间的多对多关系。
这是一个主要问题吗?
是否可以从表结构中检测到存在多对多关系并自动在模式类中创建相应的代码?
这确实是一个基本问题—— many_to_many 是“关系桥梁”而不是“关系”。该文档解释说“桥和关系之间的区别在于,桥不能用于在搜索中连接表,而是必须使用其组件关系。”
另一方面,这意味着如果正确发现了真正的关系,那么自动添加多对多关系应该很简单:首先,搜索具有两个或多个has_many
关系的表。然后,对于每一对这样的关系,创建一个多对多的关系桥梁。(当然,人们可能希望 DBIx::Class 自己做这件事。)
开发这种代码的问题在于,许多包含多个引用的表不是多对多表,并且出于其他原因具有多个引用。例如,我将为一些虚构的应用程序构建一个模式,其中某些东西可以被视为多对多表,而实际上并非如此。
create table category (
id primary key,
...
);
create table sub_category (
id primary key,
category references category(id),
...
);
/* EDIT:
This is the table that could be regarded as many_to_many
by an automated system */
create table product (
id primary key,
category references category(id),
sub_category references sub_category(id),
...
);
可以以这种方式构建一些东西以便于使用,而不必在网站上的数据库中进行多个表连接,尤其是在考虑速度时。一段代码很难明确地说“这不是一个 many_to_many”的情况,而开发人员应该能够很容易地弄清楚它,并在校验和下方添加 many_to_many 行。
我认为 DBIX::Class 模式输出了一个很好的起点,除此之外,尤其是在使用非 MySQL 数据库中的自动编号时。我经常需要在“不要在此行之上修改”的内容之上进行修改(当然,当然,many_to_many 显然可以低于该校验和。