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

时间:2014-05-22 11:29:38

标签: mysql database-design

我正在设计数据库,并希望了解最佳方法。

让我们说我有用户表(标准字段名字,姓氏,电子邮件等),每个用户都有不同货币的余额(usd,eur,gbp等)。对于每个货币,都有几个字段(例如可用金额,保留金额或类似的东西)。至少有30种不同的货币。

用户可能拥有每种货币的数据,但非常不可能。平均而言,用户将有3-4种货币。

最好是:

a)一个大表,其中包含用户信息和所有货币的列。

b)一个用户信息表和每个货币一个表。

数据库将被读取并更新。

如果我采用第一种方法,会有很多空字段可能会使数据库非常大(货币的每个字段都是DECIMAL(20)),但是可以在一个查询中完成用户余额。

如果我采用第二种方法,只有当用户拥有该货币的余额时才会填充某些货币表,这会使数据库小得多,但要获得总用户余额,我必须在一个查询中为每个货币表进行连接。

哪种选择更适合最佳性能?

2 个答案:

答案 0 :(得分:1)

您没有选择。

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

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

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

balances表将两者联系起来。它会有UserIdCurrencyId以及有关余额的其他信息,例如数字数量和日期。

答案 1 :(得分:0)

我建议如下表格结构:

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

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

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

  • 我最终会创建一个表来使用ID链接User,Currency和AmountType。这看起来像{ID,UserCode,CurrencyCode,AmountTypeCode},例如,您可以使用{1,1,5,2}作为数据。

在此链接表中,您有唯一的ID来标识记录(1)。根据上面的示例,UserCode为1(Joe),CurrencyCode为5(GBP),AmountTypeCode为2,这将转换为' Reserved Amount'。

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