保持盈利记录以确保绩效和可维护性的最佳方式

时间:2017-01-29 17:41:40

标签: mysql sql database-design

我试图记录我网站用户的收入,并且我坚持认为以下哪种设计在性能和整体可用性方面最佳:

•第一种方式:

通过这种方式,将创建一个包含每年表格的单个数据库。每个表将有13列,用户ID和12个月。每个字段的值将是一个字符串化数组,其中包含该月所有日期的值,如下所示: [12.5, 28.3, 9.75, ...]

代码:

-- Create a database to keep record of the earnings of all users.
CREATE DATABASE IF NOT EXISTS `Earnings_Record`;

-- Create a table for each year containing 13 columns, the user ID and the 12 months.
CREATE TABLE IF NOT EXISTS `Earnings_Record`.`Earnings_2017` (
    `ID` INT(11) NOT NULL,
    `January` VARCHAR(250) NOT NULL,
    `February` VARCHAR(250) NOT NULL,
    ...
    `December` VARCHAR(250) NOT NULL,
    PRIMARY KEY (`ID`)
) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;

•第二种方式:

通过这种方式,将创建多个数据库,每年一个,包含每个月的表。每个表将有28-31 + 1列,用户ID和28-31天。每个字段的值都是小数,如下所示: 12.5

代码:

-- Create a database to keep record of the earnings of all users for 2017.
CREATE DATABASE IF NOT EXISTS `Earnings_2017`;

-- Create a table for each month with 28-31 + 1 columns, the user ID and the 28-31 days.
CREATE TABLE IF NOT EXISTS `Earnings_2017`.`January` (
    `ID` INT(11) NOT NULL,
    `Day 1` DECIMAL(10, 2) NOT NULL,
    `Day 2` DECIMAL(10, 2) NOT NULL,
    ...
    `Day 31` DECIMAL(10, 2) NOT NULL,
    PRIMARY KEY (`ID`)
) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;

由于该网站有望运行5 - 10年,这是在整体性能和长期可维护性方面设计的最佳方式吗?

(要记住的一点是,每个用户的收入每天都会为活跃用户多次更新)

3 个答案:

答案 0 :(得分:1)

第三种方式:

创建单个数据库。为每个实体创建一个表:

scanf()

简单。易于查询。正是你需要的。这是表示数据的SQL方式。

答案 1 :(得分:0)

很难回答这个问题 - 但任何需要多个数据库或表的解决方案都可能无法维护,可扩展或快速。

我真的不了解您的业务领域 - 您说您希望维持每位用户的收入,但您的表格没有任何对用户的引用。

要设计数据库,了解典型查询真的有帮助 - 您想了解一段时间的总收入吗?您想找到收入高和/或低的日子吗?您想要汇总一组日期的收入,例如“每个星期一”?

我从:

开始
table earnings
-------------
earnings_date (date) (pk)
earnings_amount (decimal 10,2) 

答案 2 :(得分:0)

多个数据库 -

将这些月份划分为12列 -

字符串化 - 只有在您从不需要MySQL来过滤数据或对数据进行算术运算时。

本论坛将以各种方式讨论所有这些问题。

表中有数千甚至数百万行没有问题。其他方法是头痛的原因。