假设我有一个函数将记录插入到数据库表中,字符串字段的长度有限。一般来说,我应该在什么时候截断对于存储位置来说太长的字符串,插入函数本身,或者在代码中调用它的每个点?
(我在这里假设截断太长的字符串比抛出异常更令人满意。)
答案 0 :(得分:3)
我认为这取决于功能的位置和可访问性。
如果它是一个只构成你自己的SQL库的私有函数,那么你可能会在函数中截断它。
如果它在一个库中,比如说,你的团队在工作中都使用了,那么你可能需要在尝试插入字符串之前至少解析字符串。
如果它是一个公共API,那么你不应该默默地截断任何东西 - 而是抛出一个有意义的异常。
答案 1 :(得分:1)
这应该位于insert函数中 - 它特定于数据库实现而不是调用应用程序。如果您设法更改数据结构,则不希望必须返回所有客户端代码以确保使用完整字符串。
答案 2 :(得分:0)
根据Widor,我可以补充一下:
理想情况下,您的应用程序应该是结构化的,以便有一个独特的数据层将您的代码的其余部分与数据库及其实现逻辑分开。
在高流量系统中,理想情况下,您希望限制在数据库和代码之间来回传递的数据量,因此数据验证应在数据层传递到数据库之前执行。在这里,您可以为业务逻辑提出一个有意义的例外来处理。
数据层提供的对象数据需要与数据库中实际存储的内容无关。例如,它可能呈现一个数据对象类,实际上是存储在多个表中的数据的组合。
数据层本身的结构可以处理不同的数据库实现。
我过去曾使用工厂模式,允许我在运行时根据需要在SQL,MySQL数据库,XML文件存储和已编译的测试数据之间切换,而无需重新编译。
修改强> 您的应用程序数据层是应用程序代码之间的接口,例如业务逻辑和GUI,以及您的数据库。
业务逻辑将触发数据层以使用您的字符串更新数据库。
在您的示例中,数据层包含您的更新功能。
您可以验证字符串,如果太长则截断它,然后根据需要更新数据库(通过存储过程调用或直接写入)。
实际上,您将拥有许多必须限制为相同长度的字符串,因此建议通过单独的函数执行验证以保存重复的代码。
此外,您可能希望验证/截断字符串并通知用户/调用代码,而无需将数据写入数据库。
基本上,这是由您的应用程序数据层代码执行的,例如,它可以封装在类库/ dll中,而不是留给数据库处理或业务逻辑(除了对任何错误事件/响应做出反应)反馈)。