是否应该将数据库表名存储在配置文件中作为一种“最佳实践”?
我理解将表名存储在一个配置文件中可以使将来的更新更容易:如果表被重命名,那么只需要更新一个文件。
但是,假设检索表名是使用如下函数完成的: getTableName_Customers() (假设表名是Customers)
如果表Customers被重命名为客户端,我们还应该将函数名更新为getTableName_Clients(),这意味着getTableName_Customers()的所有出现都将在源代码中“具有”重命名。
对我来说,结果是对所有源文件中出现的硬编码表名进行重命名。
应该将表名存储在配置文件中还是在源代码中保留为“硬编码”?在这个问题上有什么最佳做法吗?
谢谢
发布于 2017-06-19 12:42:32
在数据库与代码库(如Java & 波斯特格斯 )分离的大多数开发环境中,是的,您必须手动更新代码库以与数据库中的名称更改保持同步。
在集成到数据库(如4D或文件制造者 )的开发环境中,没有任何问题,在这些数据库中,名称更改会自动渗透到整个代码库中。
数据库迁移工具
您可能希望了解数据库迁移工具,如https://flywaydb.org/或http://www.liquibase.org/或其他工具。
这些工具为定义数据库、添加/删除/修改表、添加/删除/修改列、添加/删除/修改索引等提供了一种有组织的方法。该工具查看现有数据库,并自动应用任何尚未应用的修改。
该工具跟踪数据库迁移脚本(SQL或其他如XML或Java代码等)。在档案里。你可以选择把这些文件和你的应用程序的源代码放在一起,如果这对你的情况有意义的话。
因此,当您决定将Customer
表重命名为Client
时,您可以使用一些搜索和替换操作来更新您的Java代码。同时,编写数据库修改脚本。请放心,当遇到需要更新的数据库时,数据库迁移工具将自动应用最新的脚本。
是的,使用迁移工具,您仍然需要在两个地方更改名称(应用程序代码和迁移脚本),但是您可以方便地同时做这两件事,而不必担心部署。
发布于 2017-06-19 01:28:49
如果表
Customers
被重命名为Clients
,我们还应该将函数名更新为getTableName_Clients()
。
这取决于是什么促使重命名的。如果它是一个“技术”重命名(将customers
重命名为多租户数据库中的acme_customers
),那么您当然不会重命名您的函数。这就是抽象的全部目的。类似于customers
=> clients
。这似乎只是同一件事的不同名称。
但是,如果名称是由“更大”的更改引起的,那么最好也重命名函数,以反映更改(例如,现在customers
是带有引用customer_profile
的users
)。
发布于 2017-06-19 01:33:01
答案取决于您试图优化的内容以及应用程序如何连接到DB。
如果您试图创建一个易于维护的直接访问数据库的程序,您可以使用这种方法,假设数据库表名经常更改的操作环境。但是,这种方法将牺牲在每次创建查询时都需要函数调用的性能。例如。
String query="select * from "+getTableName_Customers();
使用缓存机制可以很容易地修复性能,但是这需要更多的努力。考虑到大多数IDE的重构工具集,重命名函数应该是一项简单的任务。
当程序直接管理数据库时,使用单个类编写所有查询和表是常见的做法。
然而,作为最佳实践,最好使用持久性框架,如Hibernate (http://hibernate.org/)。这将抽象化大部分维护工作,并提供其他优势。
https://stackoverflow.com/questions/44626592
复制