Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database ORM自动创建表违反DBA首选项_Database_Oop_Language Agnostic_Orm - Fatal编程技术网

Database ORM自动创建表违反DBA首选项

Database ORM自动创建表违反DBA首选项,database,oop,language-agnostic,orm,Database,Oop,Language Agnostic,Orm,我正在使用ORM从模型类自动创建表。我以一种对应用程序来说很自然的方式命名类及其字段。然后,ORM将这些相同的名称用于表和列,并自动生成其他对象的名称,如ORM完全抽象的约束和序列 我没有声明表、列等的命名方式。我让ORM来决定。从应用程序的角度来看,我认为这是很有意义的 我团队的DBA一点也不喜欢这个。DBA表示,如果表“A”中的列“B”对表“X”中的字段“Y”具有外键约束,则名称必须为“A.X_Y”,而不是“A.B”。DBA说,这是命名外键的“正确”方法,因此ORM命名不正确。我所熟悉的两种

我正在使用ORM从模型类自动创建表。我以一种对应用程序来说很自然的方式命名类及其字段。然后,ORM将这些相同的名称用于表和列,并自动生成其他对象的名称,如ORM完全抽象的约束和序列

我没有声明表、列等的命名方式。我让ORM来决定。从应用程序的角度来看,我认为这是很有意义的

我团队的DBA一点也不喜欢这个。DBA表示,如果表“A”中的列“B”对表“X”中的字段“Y”具有外键约束,则名称必须为“A.X_Y”,而不是“A.B”。DBA说,这是命名外键的“正确”方法,因此ORM命名不正确。我所熟悉的两种ORM引擎都允许将类/字段名显式映射到表/列名,因此我知道在不更改类的情况下容纳DBA是可能的

我的问题是,在实践中,这样做(显式映射名称)是否必然会在应用程序中引入额外的实体(即新的配置文件/节、新代码)或耦合(即导入、装饰器、注释),而这些实体可能不存在?ORM的设计各不相同,因此我认为,对于不同的引擎,答案可能是不同的

如果这个答案几乎是普遍的,那么我认为这是一个很好的论点,即DBA应该以生产力为目标,以数据库存在的逻辑来满足应用的需要,而不是相反。关于这一点的评论也值得欢迎


请注意,我并不是要就类/字段/表/列的命名方式提出具体建议。

否,显式映射名称不会创建额外的实体或耦合;它定义了DBA决定适合其数据库的策略和流程。我还认为,你的逻辑有点倒退;应用程序的存在是为了满足数据库的需要。任何公司安装的软件都是为了服务/填充/呈现数据库中存在的数据,而不是相反

考虑一下这一点;无论公司做什么,软件都会随着需求和技术的变化而变化,并随着标准和复杂性的发展而重构。但是,存储在数据库中的数据不会被删除;即使模式发生了变化/发展,底层数据也几乎不会发生变化

ORM的设计各不相同,因此我认为,对于不同的引擎,答案可能是不同的

你就在这里。根据ORM的不同,显式指定字段->列映射可能(也可能不)以配置条目、注释、属性等形式引入额外的实体。话虽如此,这就是面包和黄油(或者我应该说是最基本的)对于ORM引擎,因此处理这些映射通常不会增加明显的开销


我觉得你绝对不能用它作为反对显式命名表、列等的理由。通常情况下,你会有另一个应用程序使用相同的数据库。应用程序生成的默认名称可能对该应用程序毫无意义。我会让DBA为数据库工件确定正确的术语,并在我的应用程序中调整到我的域模型的映射。毕竟,这就是ORM增加价值的地方。

编码标准的存在是有原因的——如果我是DBA,我可能会建议使用ORM而不进行修改的生产率优势应该以可维护性的名义出现

这是一个权衡的问题:如果根据公司标准命名外键列的额外工作很少(在我使用过的大多数ORM中也是如此),我就这么做


如果你的ORM让它变得非常困难,我会向DBA解释,这是一个不同于他过去使用的架构-使用ORM意味着很少会有任何手动SQL编写-它都是由ORM自动创建的,因此放松编码标准是有意义的

您能否给出一个具体的例子,说明适应策略是一种改变,而不是全新的配置/代码?您断言应用程序满足数据库的需要,我也感到非常惊讶。虽然我们可能假设stackoverflow.com依赖于一个或多个数据库,但我们用户并不真正关心数据库,我们关心的是stackoverflow.com。@WBERY:我不太理解您关于“适应策略是一种改变”的问题。此外,我强烈主张stackoverflow上的用户不关心(特别是太多)运行站点的软件;但我们关心的是问题(即,存储在数据库中的数据)。不,我们关心的是数据库中的数据,其中的数据远不止代码。StackOverflow可以疯狂地更改UI,但是如果我的问题/答案/评论被破坏,我就放弃它。作为一个具体的例子,在Django中,要使用DBA的名称,我只需向每个字段添加一个
db_column=
参数,并向模型的
Meta
类添加一个
db_table
属性。容易极了。如果我需要的话,还有
db\u索引
db\u表空间
参数。让我从不同的角度解释一下。如果您的应用程序拉入一个库,您是否要求该库的命名约定与您的相匹配?好吧,也许你会,如果这是一个内部图书馆,而且你有权威,你可以侥幸逃脱,但大多数时候,这是不会发生的。为什么?因为如果名称更改,其他使用该库的应用程序将中断。万众一心>