2017-01-29 4 views
0

Я стараюсь вести учет доходов пользователей моего веб-сайта, и я застрял в том, какой из следующих конструкций лучше всего подходит для производительности и общего удобства:Лучший способ сохранить рекорд заработка, обеспечивающий производительность и ремонтопригодность

• Первый способ:

Таким образом, единая база данных будет создана содержащий таблицу для каждого года. Каждая таблица будет иметь 13 столбцов, идентификатор пользователя и 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 столбцы, идентификатор пользователя и 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 лет, что это лучший способ создать устройство, когда дело доходит до общей производительности и долгосрочной ремонтопригодности ?

(Одна вещь, чтобы иметь в виду, что доходы каждого пользователя будет обновляться несколько раз в день для активных пользователей)

ответ

0

Трудно ответить на этот вопрос - но любое решение, которое требует нескольких баз данных или таблиц вероятно, не поддерживается или масштабируема, или быстро.

Я действительно не понимаю ваш бизнес-домен - вы говорите, что хотите сохранить прибыль на одного пользователя, но ваши таблицы не имеют никакой ссылки на пользователя.

Чтобы создать базу данных, это действительно поможет понять типичные запросы - вы хотите узнать общий доход за определенный период? Вы хотите найти дни с высокими и/или низкими заработками? Вы хотите агрегировать прибыль по группе дат, например. "каждый понедельник"?

Я хотел бы начать с:

table earnings 
------------- 
earnings_date (date) (pk) 
earnings_amount (decimal 10,2) 
+0

Даты не важны. Я хочу сохранить их, чтобы я мог рассчитывать статистику, такую ​​как прогнозируемые доходы за месяц/срок/год, рост за последний период и т. Д. Пользователи уже сохранены в другой базе данных, и я буду сопоставлять данные с ними с помощью идентификатора. –

1

Третий путь:

Создать единую базу данных. Создайте единую таблицу для каждого объекта:

CREATE DATABASE IF NOT EXISTS Earnings_Record; 

CREATE TABLE IF NOT EXISTS Earnings_Record.Users (
    UsersId INT AUTO_INCREMENT PRIMARY KEY, 
    . . . 
); 

CREATE TABLE IF NOT EXISTS Earnings_Record.Earnings (
    EarningsID INT AUTO_INCREMENT PRIMARY KEY, 
    UserId INT NOT NULL, 
    EarningsDate DATE, 
    Amount DECIMAL(10, 2) -- or whatever 
    CONSTRAINT fk_Earnings_UserId FOREIGN KEY (UserId) REFERENCES Users(UserId) 
) ; 

Простой. Простой в запросе. Только то, что вам нужно. Это SQL-метод представления данных.

+0

Спасибо за предложение. База данных, о которой я говорю, является «расширением», и я хочу, чтобы она сохранила прибыль и сделала конкретные расчеты, такие как прогнозируемые доходы, рост за последний период и т. Д. Пользователи сохраняются в моей существующей «основной» базе данных, и я буду соответствовать данные для каждого из них, используя идентификатор. –

0

Несколько баз данных - NO

Splaying месяцы через 12 колонн - NO

Stringifying - Только если вы никогда не нужно MySQL, чтобы фильтровать данные или выполнять арифметические операции над данными ,

Все эти вопросы обсуждаются на этом форуме различными способами.

Нет проблем с тысячами, даже миллионами строк в таблице. Другие подходы - головные боли.