数据库应该在哪里转换数据?
Where should data be transformed for the database?
数据库应该在哪里进行数据转换?我相信这叫做数据 normalization/sanitization.
在我的数据库中,我有用户创建的商店——比如 Etsy。假设用户在他们的商店输入商品价格“1,000.00”。但是我的数据库将价格存储为 integer/pennies-“100000”。 “1,000.00”应该在哪里转换为“100000”?
这是我想到的两种方式。
在前端:在HTTP请求之前,输入数据在前端从“1,000.00”转换为“100000”。在这种情况下,后端将验证价格是一个整数。
后台: "1,000.00" 原样发送到后台,然后后台验证是价格格式,然后后台转换在存储到数据库之前将价格转换为整数“100000”。
这两种方法似乎都行得通,但有一种方法比另一种方法更好,还是有标准方法?我认为第二种方法最适合减少代码重复,因为可能有多个前端(移动、Web 等)和一个后端。但第一种方式似乎也更简洁 - 只需发送 api 需要的内容即可。
我正在使用 MERN 应用程序(如果有任何不同的话),但我认为这与语言无关。
我会混合使用两者(这是最佳实践,AFAIK)。
无论如何前端都必须进行某种验证,因为您不想等待后端获得验证响应。我也会在这里添加实际的转换。
我猜验证代码会适应每个前端,因为每个前端都有不同的框架/语言,所以我不一定会在这里看到代码重复(逻辑是的,但不是实际的)代码)。作为最后的手段,您可以创建一个通用验证库。
后台要对前台传来的转换值再次校验,作为双重校验,然后存入数据库。您永远不知道后端将来是否会与其他组件集成,输入清理始终是最佳实践。
简短版
两种方法都可以,我认为没有标准方法。我更喜欢在前端格式化。
长版
在这种情况下,我所做的是查看我预期的业务需求并列出优缺点。这里只是对此的一些想法。
- 如果您决定在前端进行价格的每一次转换(格式化、规范化、消毒),您的后端将保持较小,并且您将拥有更少的端点或具有更少选项的端点。根据前端,您可以选择最适合您的最终用户。交付的代码量将保持较小,因为可以缓存应用程序并制作所有格式化内容。
- 如果您在后端实施所有内容,您就可以完全控制向用户提供的格式。尤其是在处理多种不同的语言时,直接从服务器获取正确的显示值可能会很有帮助。
此外,了解一些不同的 API 知名供应商以及它们如何处理价格可能会有所帮助。
Paypal API 使用金额对象将价格与货币代码一起传递为小数形式。
"amount": {
"value": "9.87",
"currency": "USD"
}
前端如何处理,由你决定。这是一个 link,其中包含来自文档的示例请求:
Stripe 使用的模型略有不同。
{
unit_amount: 1600,
currency: 'usd',
}
它有以货币基本单位表示的整数值作为金额和一个货币代码来描述价格。这里有两个例子可以更清楚地说明:
- https://stripe.com/docs/api/prices/create?lang=node
- https://stripe.com/docs/checkout/integration-builder
在这两种情况下,都必须在发出请求之前进行规范化和清理。在向用户显示之前,响应还需要进行格式化。当然,这些请求大部分都是后台代码完成的。但是,如果您查看来自 Stripe 或 Paypal 的预建结帐页面,它们也使用标准化和净化的值来进行前端集成:https://developer.paypal.com/docs/business/checkout/configure-payments/single-page-app
Conclusion/My意见
出于安全原因,我总是希望后端尽可能简单。更少的代码(又名端点)意味着更小的攻击面。更多的配置可能性意味着需要付出更多的努力来确保应用程序的安全。此外,如果您有业务要求从后端交付所有格式完美的内容,您可以编写另一个(微)服务来接管一些转换任务。示例用例可能是如果您更喜欢后端代码而不是前端代码(考虑 your/your 团队的技能),如果您想部署许多不同的前端并希望确保它们都使用单一来源其显示值的真实性,或者您是否需要满足监管要求才能准确了解交付给用户的内容。
感谢您的提问,希望我能为您的决定提供一些指导。最后,你总是希望你选择了不同的方法...... ;)
为了安全起见,它必须在后端进行清理。清理涉及确保仅接受 Web 表单中特定字段的值。这就像高级俱乐部的宾客名单。它不仅与字段(例如用户名)有关,还与值(例如 bobbycat 或 )有关;删除 TABLE 个用户;)。所以这是关于确保数据库的安全性。
另一方面,规范化涉及在将数据存储到数据库之前对数据进行转换。这是您提出的示例:1,000 到 1000,因为您将其存储为数据库中没有小数的整数。
这段代码属于哪里?我认为没有明显的赢家,因为这取决于您的用例。
如果这是一个简单的事情,比如确保值是一个整数而不是一个字符串,您应该将它卸载到网络表单(即前端),因为表单已经有一个“类型”属性来强制执行这些.
但想象一个更复杂的场景。假设您正在构建一个允许用户构建 Facebook 广告活动的应用程序(您的应用程序是第三方开发者应用程序,例如 Smartly.io)。这意味着在用户点击“创建活动”之前必须填写大约 30 个表单字段。并且某些表单字段中的值会影响表单其他部分的有效性。
在这种情况下,将至少一些验证放在后端可能是有意义的,因为您的后端需要 运行 执行一系列操作(例如创建 Post,然后创建广告)以确保有效性。在前端编写这些验证和规范化代码对您来说没有意义。
简而言之,这是您需要取得的平衡。利用 Web API 和表单验证,将简单的事情卸载到前端。将更复杂的归一化步骤留给后端。
在相关说明中,如果您尝试使用来自其他服务的数据然后转换它以适应您在其中存储信息的方式,则可以使用 ETL(提取、转换、加载)的更广泛概念你自己的数据库。在这种情况下,通常最好将其作为一个存储库单独保存 - 使用 Apache Airflow 之类的工具来管理和可视化 cron 作业。
数据库应该在哪里进行数据转换?我相信这叫做数据 normalization/sanitization.
在我的数据库中,我有用户创建的商店——比如 Etsy。假设用户在他们的商店输入商品价格“1,000.00”。但是我的数据库将价格存储为 integer/pennies-“100000”。 “1,000.00”应该在哪里转换为“100000”?
这是我想到的两种方式。
在前端:在HTTP请求之前,输入数据在前端从“1,000.00”转换为“100000”。在这种情况下,后端将验证价格是一个整数。
后台: "1,000.00" 原样发送到后台,然后后台验证是价格格式,然后后台转换在存储到数据库之前将价格转换为整数“100000”。
这两种方法似乎都行得通,但有一种方法比另一种方法更好,还是有标准方法?我认为第二种方法最适合减少代码重复,因为可能有多个前端(移动、Web 等)和一个后端。但第一种方式似乎也更简洁 - 只需发送 api 需要的内容即可。
我正在使用 MERN 应用程序(如果有任何不同的话),但我认为这与语言无关。
我会混合使用两者(这是最佳实践,AFAIK)。
无论如何前端都必须进行某种验证,因为您不想等待后端获得验证响应。我也会在这里添加实际的转换。
我猜验证代码会适应每个前端,因为每个前端都有不同的框架/语言,所以我不一定会在这里看到代码重复(逻辑是的,但不是实际的)代码)。作为最后的手段,您可以创建一个通用验证库。
后台要对前台传来的转换值再次校验,作为双重校验,然后存入数据库。您永远不知道后端将来是否会与其他组件集成,输入清理始终是最佳实践。
简短版
两种方法都可以,我认为没有标准方法。我更喜欢在前端格式化。
长版
在这种情况下,我所做的是查看我预期的业务需求并列出优缺点。这里只是对此的一些想法。
- 如果您决定在前端进行价格的每一次转换(格式化、规范化、消毒),您的后端将保持较小,并且您将拥有更少的端点或具有更少选项的端点。根据前端,您可以选择最适合您的最终用户。交付的代码量将保持较小,因为可以缓存应用程序并制作所有格式化内容。
- 如果您在后端实施所有内容,您就可以完全控制向用户提供的格式。尤其是在处理多种不同的语言时,直接从服务器获取正确的显示值可能会很有帮助。
此外,了解一些不同的 API 知名供应商以及它们如何处理价格可能会有所帮助。
Paypal API 使用金额对象将价格与货币代码一起传递为小数形式。
"amount": {
"value": "9.87",
"currency": "USD"
}
前端如何处理,由你决定。这是一个 link,其中包含来自文档的示例请求:
Stripe 使用的模型略有不同。
{
unit_amount: 1600,
currency: 'usd',
}
它有以货币基本单位表示的整数值作为金额和一个货币代码来描述价格。这里有两个例子可以更清楚地说明:
- https://stripe.com/docs/api/prices/create?lang=node
- https://stripe.com/docs/checkout/integration-builder
在这两种情况下,都必须在发出请求之前进行规范化和清理。在向用户显示之前,响应还需要进行格式化。当然,这些请求大部分都是后台代码完成的。但是,如果您查看来自 Stripe 或 Paypal 的预建结帐页面,它们也使用标准化和净化的值来进行前端集成:https://developer.paypal.com/docs/business/checkout/configure-payments/single-page-app
Conclusion/My意见
出于安全原因,我总是希望后端尽可能简单。更少的代码(又名端点)意味着更小的攻击面。更多的配置可能性意味着需要付出更多的努力来确保应用程序的安全。此外,如果您有业务要求从后端交付所有格式完美的内容,您可以编写另一个(微)服务来接管一些转换任务。示例用例可能是如果您更喜欢后端代码而不是前端代码(考虑 your/your 团队的技能),如果您想部署许多不同的前端并希望确保它们都使用单一来源其显示值的真实性,或者您是否需要满足监管要求才能准确了解交付给用户的内容。
感谢您的提问,希望我能为您的决定提供一些指导。最后,你总是希望你选择了不同的方法...... ;)
为了安全起见,它必须在后端进行清理。清理涉及确保仅接受 Web 表单中特定字段的值。这就像高级俱乐部的宾客名单。它不仅与字段(例如用户名)有关,还与值(例如 bobbycat 或 )有关;删除 TABLE 个用户;)。所以这是关于确保数据库的安全性。
另一方面,规范化涉及在将数据存储到数据库之前对数据进行转换。这是您提出的示例:1,000 到 1000,因为您将其存储为数据库中没有小数的整数。
这段代码属于哪里?我认为没有明显的赢家,因为这取决于您的用例。
如果这是一个简单的事情,比如确保值是一个整数而不是一个字符串,您应该将它卸载到网络表单(即前端),因为表单已经有一个“类型”属性来强制执行这些.
但想象一个更复杂的场景。假设您正在构建一个允许用户构建 Facebook 广告活动的应用程序(您的应用程序是第三方开发者应用程序,例如 Smartly.io)。这意味着在用户点击“创建活动”之前必须填写大约 30 个表单字段。并且某些表单字段中的值会影响表单其他部分的有效性。
在这种情况下,将至少一些验证放在后端可能是有意义的,因为您的后端需要 运行 执行一系列操作(例如创建 Post,然后创建广告)以确保有效性。在前端编写这些验证和规范化代码对您来说没有意义。
简而言之,这是您需要取得的平衡。利用 Web API 和表单验证,将简单的事情卸载到前端。将更复杂的归一化步骤留给后端。
在相关说明中,如果您尝试使用来自其他服务的数据然后转换它以适应您在其中存储信息的方式,则可以使用 ETL(提取、转换、加载)的更广泛概念你自己的数据库。在这种情况下,通常最好将其作为一个存储库单独保存 - 使用 Apache Airflow 之类的工具来管理和可视化 cron 作业。