自动创建MySQL表[用户控制]

时间:2016-09-23 18:01:12

标签: php mysql transactions

首先让我在我的问题中非常准确:

基本上我正在学习PHP和MySQL,所以为自己开发一个小项目。我正在为我和我的朋友创建一个网站,我们可以跟踪我们彼此欠的钱。特别是对于需要在几个月内以比特返回的大笔金额。因此,我们任何人都可以开始一个“记录”,他们给这个记录一个名字,例如“汽车费用”,然后他们可以在每次从借款人那里拿回任何大笔款项时向该记录添加交易。这个“汽车费用”记录显然会有一些列,包括交易ID,退货金额和日期等(很快就会回到这一点)。

我知道我肯定需要两张桌子: 1)用户 - 为我们所有人存储用户的姓名和电子邮件地址; 2)记录 - 保存所有记录的摘要(但不保存与任何记录有关的交易细节),例如记录标题,记录描述,创建时间,最后更新时间,涉及的各方名称等。

然而,问题在于我不确定系统的第三部分将如何工作,我将详细介绍特定记录以显示记录中的所有交易,例如已经支付了多少钱以及在什么日期等等。

我正在考虑为用户创建的每条记录创建一个新表。 在此表中,我将具有transaction-id,transaction-date,money-in / out,comments和用于编辑/删除任何事务的控件。

在我看来,这种方法的问题(每次创建一个新表)是给每个新创建的表一个用户定义的名称将是一个挑战,加上执行自动查询为每个广泛的记录设计新表可能非常困难。

请咨询,实施该系统的第三部分的最佳方法是什么,或者对我的网站的整体数据库设计有任何更好的想法。非常感谢提前。

2 个答案:

答案 0 :(得分:0)

通常,您永远不希望在数据库中包含太多表,当然也不是用户定义的表。它不仅会占用空间,而且几乎不可能从中查询。

您应该做的是为所有与您列出的列的事务创建一个单独的表,但是另一个列包含该事务所属的用户的id。这允许您通过JOIN命令轻松查询。

答案 1 :(得分:0)

您需要创建一个简单,一致的架构来表示系统中的所有不同元素:用户和Exchange。选择名称可能很棘手,因为您通常希望避免使用保留关键字,例如" transaction"。

为每笔交换创建一个新表是绝对错误的。关系数据库的重点是将大量记录存储在同一个表中,这些记录可能与其他记录有简单的关系。例如,交易所通过各自的用户"来引用发件人和收件人。记录标识符。

简单来说:

CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY NOT NULL,
  name VARCHAR(255),
  created_at DATETIME
);

CREATE TABLE exchanges (
  id INT AUTO_INCREMENT PRIMARY KEY NOT NULL,
  amount NUMERIC(12,2) NOT NULL,
  sender_user_id INT,
  recipient_user_id INT,
  created_at DATETIME
);

这是一种非常简单的方法。更强大的解决方案使用ledger structure,其中交换被分解为两个相关但独立的账户之间的转移。

现在,如果你想知道所欠的余额:

SELECT sender_user_id, SUM(amount) FROM exchanges
  WHERE recipient_user_id=?
  GROUP BY sender_user_id

这将告诉您每个收件人他们欠多少钱。只要你代表"支付"作为负数发送,则值应为零。分类帐可以更好地完成这项工作。