2015-05-28 5 views
2

Мне нужна помощь в разработке моей базы данных для приложения, которое я помогаю в разработке. Это приложение является инструментом отслеживания бизнеса для стоматологических кабинетов. Одним из аспектов приложения является то, что каждый месяц пользователь вручную вводит отчет о прибылях своего офиса Profit & и приложение с отслеживанием и отображает результаты.Дизайн базы данных для таблицы 36 столбцов

Пользователь вводит до 36 различных элементов: Идентификатор офиса, Доход, Оклады сотрудников, Расходы на работу, Расходы на рекламу и т. Д. Вначале я собирался создать таблицу с 36 столбцами (по одному для каждого расхода пользователя был введен), и каждая запись «Прибыль и убыток» представляет собой строку в таблице. Но я читал о нормализации базы данных и читал много мест с людьми, говорящими, что это абсурдное количество столбцов. Каждые месяцы подают эти данные в 10 отделений.

Есть ли другие способы организовать это?

Ниже приведен пример кода, используемого для ввода данных. Это не содержит всех 36 переменных, поскольку я только что использовал это для тестирования. Как это смешно выглядит?

'foreach ($_POST as $key => $value) { //get each $_POST as its own variable 
     if (isset($$key)) continue; 

     $$key = $value; 
    } 


    $stmt = $db->prepare("INSERT INTO profitloss (officeid, date_month, date_year, production, collections, pt_refunds, other_income, 
                 dental_supplies, labs, invisalign, rent_lease, utilities, janitorial, repairs, one800dent, 
                 online_marketing, other_marketing, management_fee, merchant_fee, bank_charges, telephone, 
                 office_supplies) 
                 VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); 

    $stmt->bind_param("iddddddddddddddddddddd", $officeid, $date_month, $date_year, $production, $collections, $pt_refunds, $other_income, $dental_supplies, $labs, $invisalign, $rent_lease, $utilities, $janitorial, $repairs, $one800dent, $online_marketing, $other_marketing, $management_fee, $merchant_fee, $bank_charges, $telephone, $office_supplies); 

    $stmt->execute();' 
+0

Да, есть, безусловно, и другие (лучше) пути, и на самом деле вы должны прочитать по нормализации базы данных. – Daan

+1

Лучше подходит для http: //dba.stackexchange.com –

ответ

1

Необходимость нормализации обычно зависит от вариантов использования вашей базы данных. Подумайте, насколько возможно, что список расходов изменится в будущем, какие запросы будут выполняться в вашей базе данных, какие отчеты вы создадите. Если вы действительно думаете, что вы должны нормализовать его, это трудно сказать, что лучший способ без рассмотрения вашей модели предметной области, но вот один из возможных способов сделать это:

expense_type — dictionary of expense types 
- id 
- name 

expense — a particular expense of a certain type for a certain user statement 
- id 
- expense_type_id — references expense_type.id 
- profit_and_loss_id — references profit_and_loss.id 

profit_and_loss — a single user statement 
- id 
- user_id 
- office_id 

Если база данных разработана таким образом, вы можете легко добавлять новые виды расходов в будущем без изменения таблиц или нарушения согласованности данных.

+0

Спасибо за это! – xRK

0

Не включайте каждый расход или доход в виде столбца. Скорее сделайте строку с типом транзакции.

Таким образом, вы будете иметь таблицу с меньшим числом столбцов:

  1. Тип сделки: доходы или расходы.
  2. Категория трансакции: Доходы, Оклады сотрудников, Расходы на работу, Расходы на рекламу. (Доход может быть divied на множество категорий)
  3. Сумма сделки
  4. офис Id

Это позволит сделать ваш дизайн более гибким. если вы добавите другую категорию транзакций, вы добавите еще одну строку, а не другой столбец.

+0

извините меньше количества столбцов –

0

Вы можете сделать что-то вроде этого,

есть один основной таблицы

CREATE TABLE bill_typ 
(
billtypid INT(2) ZEROFILL PRIMARY KEY AUTO_INCREMENT, 
billtypnam VARCHAR(100), 
billtyp CHAR(1) COMMENT "Either I OR E :: I for income, E for expance", 
status CHAR(1) 
) 

INSERT INTO bill_typ VALUES ('','production','I','A'); 
INSERT INTO bill_typ VALUES ('','collections','I','A'); 
INSERT INTO bill_typ VALUES ('','pt_refunds','E','A'); 
INSERT INTO bill_typ VALUES ('','other_income','I','A'); 
. 
. 
INSERT INTO bill_typ VALUES ('','management_fee','E','A'); 
. 

NOW Transaction ТАБЛИЦА

CREATE TABLE bill_typ 
(
bill_date DATE, 
officeid INT, 
billno INT, 
billtypid INT, 
amount DECIMAL(11,2) 
) 
Смежные вопросы