36列表的数据库设计

时间:2015-05-28 06:51:12

标签: php mysql database

对于我帮助开发的应用程序,我需要一些数据库设计方面的帮助。此应用程序是牙科诊所的业务跟踪工具。该应用程序的一个方面是每个月用户将手动输入他们的办公室的利润&损失声明和应用程序跟踪和绘制结果。

用户最多可以输入36个不同的项目:办公室ID,收入,员工工资,办公室费用,广告费用等。最初,我打算创建一个包含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();'

3 个答案:

答案 0 :(得分:1)

规范化的需要通常取决于数据库的用例。考虑费用列表将来可能发生变化的可能性,您将在数据库上执行哪种查询,您将生成哪种报告。如果您真的认为应该将其标准化,那么在不检查您的域模型的情况下很难说出最好的方法,但这是一种可能的方法:

HTML

如果您的数据库是以这种方式设计的,那么您可以在不改变表格或违反数据一致性的情况下轻松添加新类型的费用。

答案 1 :(得分:0)

不要将每项费用或收入作为一栏。而是使其成为具有事务类型的行。

这样,您将拥有一个列数较少的表:

  1. 交易类型:收入或支出。
  2. 交易类别:收入,员工工资,办公室费用,广告费用。 (收入可分为许多类别)
  3. 交易金额
  4. 办公室ID
  5. 这将使您的设计更加灵活。如果您添加另一个交易类别,您将只添加另一行而不是另一列。

答案 2 :(得分: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 TABLE

CREATE TABLE bill_typ
(
bill_date DATE,
officeid INT,
billno INT,
billtypid INT,
amount DECIMAL(11,2)
)