MySql数据库设计:一个大表还是多个小表?

MySql数据库设计:一个大表还是多个小表?,mysql,database-design,Mysql,Database Design,我正在设计数据库,想知道最好的方法是什么 假设我有一个用户表(带有标准字段firstname、lastname、email等),每个用户都有不同货币的余额(美元、欧元、英镑等)。对于每种货币,都有两个字段(例如可用金额、保留金额或类似的字段)。至少会有30种不同的货币 用户可能拥有每种货币的数据,但可能性很小。平均而言,用户拥有3-4种货币 最好是: a) 一个大桌子,上面有用于显示用户信息和所有货币的列 b) 一个表用于用户信息,一个表用于每种货币 数据库将被读取和更新 如果我使用第一种方法,

我正在设计数据库,想知道最好的方法是什么

假设我有一个用户表(带有标准字段firstname、lastname、email等),每个用户都有不同货币的余额(美元、欧元、英镑等)。对于每种货币,都有两个字段(例如可用金额、保留金额或类似的字段)。至少会有30种不同的货币

用户可能拥有每种货币的数据,但可能性很小。平均而言,用户拥有3-4种货币

最好是:

a) 一个大桌子,上面有用于显示用户信息和所有货币的列

b) 一个表用于用户信息,一个表用于每种货币

数据库将被读取和更新

如果我使用第一种方法,将会有很多空字段,这会使数据库变得非常大(每个货币字段都是十进制的(20)),但获取用户余额可以在一个查询中完成

若我使用第二种方法,那个么我将只在用户拥有某种货币的余额时填充该货币表,这将使数据库小得多,但要获得用户的总余额,我必须在一个查询中对每个货币表进行联接


哪个选项更适合获得最佳性能?

您的两个选项都不是

您需要一个用户表。你想要一张货币表。您需要一个余额的连接/关联表

users
表将包含适合一行的所有用户信息。它会有一个自动递增的主键,比如说
UserId

货币
表将包含有关货币的所有相关信息。这可能就是它的名字。它会有一个自动递增的主键,比如说
CurrencyId


余额表将两者链接起来。它将有一个
用户ID
货币ID
,以及关于余额的其他信息,如数字数量和日期。

我建议如下表结构:

  • 首先是一个包含{ID,FirstName,LastName}字段等的用户表。例如,您可能有{1,Joe,Bloggs}

  • 然后,我将使用一个名为Currency的查找表,其中包含具有唯一ID的各种类型的货币来标识它们。{ID,CurrencyName}。数据可能如下所示:{5,'GBP'}

  • 第二个查找表可用于AmountType{ID,AmountTypeName},其中您将有{1'可用金额'}和{2'保留金额'}等数据

  • 最后,我将使用ID创建一个表来链接用户、货币和金额类型。这看起来像{ID,UserCode,CurrencyCode,AmountTypeCode},例如,您可以将{1,1,5,2}作为您的数据

在此链接表中,您有一个唯一的ID来标识记录(1)。根据上面的例子,用户代码是1(Joe),CurrencyCode是5(GBP),AmountTypeCode是2,这就转化为“保留金额”


我希望您会发现这是一种合理的方法,并且这会有所帮助。

肯定是多个表。联接允许您仍然在一个查询中执行此操作,并且使用聚合函数(SUM等),您可能可以使用单个联接执行此操作。性能至关重要,因此许多联接是否会非常慢?如果正确设置了键,则它们不应如此。添加另一种货币也很简单,而对于每种货币一列,您需要更改表设计以添加新的货币,再加上根据这些货币计算任何余额的每个查询。如果我正确理解了数据的结构,则需要这样做。关于第二个查找表,我可能错了。