存储字段作为单个文本类型JSON字符串与拆分到单独表的性能影响

时间:2009-12-18 06:52:24

标签: sql mysql database database-design schema

我有一个名为Billing的表,它基本上是一个收据(用于不同类型的交易)。该应用程序具有一项功能,您可以创建新的费用(除税和其他常量以外的所有费用)。由于会有一定数量的动态费用,我们决定将结算费用存储在具有JSON结构的单个文本字段中。因此Charges列包含以下内容:

{"CrateFee":50,"DeliveryFee":90,"PackagingFee":20}
{"DeliveyFee":90,"ServiceCharge":200}

我们的替代方案是为这些费用创建一个单独的表格,具有以下结构:

Charges
BillingId | ChargeName |  ChargeValue
1           CrateFee      50
1           DeliveryFee   90
1           PackagingFee  20
2           DeliveryFee   90
2           ServiceCharge 200

我们决定不使用第二种方法,因为它会在一天内被数万行填充(估计一天内大约有一千笔交易)。我知道如果我们使用第一个数据,我们将对数据的处理能力有限,所以我真的想推动单独的表方法。但是当我谈到数据库时,我不知道扩展,优化等等,所以我需要一些帮助。

使用第二种方法可以吗?这将如何影响性能?还有其他选择吗?

3 个答案:

答案 0 :(得分:5)

第一个实现可能会更容易将数据存储在一行中,但是您将自己打开整个受伤的世界

通过在字段上正确使用索引,您不应该遇到重大问题,所以我会推荐第二种方法。

此外,在稍后的某个阶段,您可以尝试实施归档,这也应该有助于第二个表的大小。

答案 1 :(得分:3)

  

可以使用第二种方法吗?

我还没有遇到一个DBA,它允许将JSON格式存储在他们的数据库中,包括我自己。

  

该应用程序具有可以创建新费用的功能

为了正确规范化,我建议使用一个包含费用类型的单独表格。用户仍然可以向其添加费用类型,并且您使用外键来引用费用类型 - 就像您使用billingid一样。

将费用分成行的最大原因是为了便于访问报告数据等。您仍然可以使用JSON格式,但是您正在查看字符串操作,因为它是自由格式文本,您可能无法按费用名称进行分组。没关系进行字符串操作的性能损失。这不值得麻烦 - 做对了,使用选项2.

您可能还想考虑在表格中存储税金(至少是百分比) - 税收会随着时间的推移而变化,因此您需要知道购买时的税金,以便准确地重现以后开账​​单。

答案 2 :(得分:0)

如果您使用第一个建议,那么您的应用程序将会非常糟糕,并且性能会让您感到非常惊讶,并且用户会来到您的立方体来扼杀您。 (好吧那里有一点hyberbole)。

数据库设计的第一条规则是在每个字段中只存储一条信息。

使用第一种设计,当您需要知道每个客户按费用类型花费了多少时,您将无法轻松或快速地获取此数据。

您需要的是一个名为费用类型的表,其中包含类型定义。如果用户添加了新的,则会进入此表。然后你的费用表与你在第二个例子中的内容相似。通过存储标准类型并使其变得痛苦但可以添加标准类型,4317收费类型变得不太可能意味着相同的东西。稍后当您想要对数据库中的数据进行报告时,这很重要。

只要您正确索引,您在查询第二个可能性方面的性能会明显提高。

如果您的组织诚实地甚至考虑使用第一个结构,那么您需要立即雇用经验丰富的dba,因为对如何设计数据库存在明显的误解。如果您期望每天收取数千美元的费用,那么您需要考虑设计中的性能,而不是在以后加以解决。过早优化并不意味着根本不考虑优化。在数据库中,性能是您需要设计的三个最重要的事项之一(另外两个是数据完整性和安全性)。