2016-09-23 63 views
1

首先请让我在我的问题非常精确:自动MySQL表创建[用户控制]

基本上我学习PHP和MySQL等等工作的一个小项目为我自己。我正在为我和我的朋友创建一个网站,在那里我们可以跟踪我们欠对方的钱。特别是对于需要在几个月内返还的大笔款项。因此,我们任何人都可以创建一个“记录”,以便他们为此记录命名,例如'汽车费用',然后他们可以在每次从该大笔借款人收回任何回款时将交易添加到该记录中。这个“汽车开支”记录将有一些明显的栏目,包括交易ID,退货金额和日期等(稍后回来)。

我知道我一定会需要两张表: 1)用户名 - 用户名和电子邮件地址为我们所有人存储; 2)记录 - 其中保存了我们所有记录的摘要(但不包括与任何记录相关的交易详情)记录标题,记录说明,创建时间,上次更新时间,涉及的当事方名称等。

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

我正在考虑为用户创建的每个单独记录创建一个新表。 在这张表中,我将拥有交易编号,交易日期,存入/取出,注释和编辑/删除任何交易的控制。

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

请告知,实施系统第三部分的最佳方法是什么,或者对我的网站的整体数据库设计有什么更好的想法。首先十分感谢。

+0

您不需要为每个记录创建一个新表,而是为引用用户标识和记录标识的所有记录创建一个表。 – aynber

+0

谢谢aynber,我认为从同一个表内的一条记录中挑选交易会很复杂,并向他们展示哪里会有如此多的来自所有人的交易 – Ros

+0

只要您使用user_ids和record_ids正确设计表并使用正确的索引,这将不难追踪。事实上,如果您想要显示带有每条记录链接的全部交易,可能会更容易。 – aynber

回答

0

一般来说,你永远不想在数据库中有太多的表,当然也不是用户定义的表。它不仅占用空间,而且几乎不可能从中查询。

您应该做的是为所有与您列出的列交易创建一个单独的表,但是附加列保存该交易所属用户的ID。这使您可以通过JOIN命令轻松进行查询。

+0

感谢Hex37,我想如果将来有越来越多的用户(家人和朋友都知道),那么一张桌子可能会达到它的限制,每个人都有这么多的交易。 – Ros

+0

您几乎从不需要担心SQL的问题;用该脚本语言进行表搜索非常有效。这几乎是编码语言的重点。至多,对于数十万行较大的表,您需要为最旧的条目创建单独的归档表。 – Hex37

+0

谢谢你的精心制作。 那么,如何知道表何时已经达到极限,并且应该在归档表中进行划分,我们仍然可以从归档表中查询相同的方式吗? – Ros

0

您需要创建一个简单,一致的模式来表示系统中的所有不同元素:用户和交换。挑选名称可能会非常棘手,因为您通常希望避免使用“交易”等保留关键字。

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

简单来说:

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 

会告诉你在每个收件人的基础上他们欠了多少钱。只要您将“退款”表示为发送的负数,那么这些值应该为零。分类账可以更好地完成这项工作。

+0

真的很感谢这样一个详细的回复队友,你可能会像15-20分钟完成这个LOL我已经花了数周时间了。我想添加第三个“记录”(摘要)表的原因是,在用户的仪表板上,我想向他们展示他们所属的所有记录(可能在小卡片上)。 – Ros

+0

作为一名开发人员,在您的职业生涯中,您将被要求多次创建这样的分类帐系统。到第十次,它变得日常。第一次非常令人头晕目眩。简要记录通常不同步,对于少量数据,快速SUM()比不可靠简要记录更好。 – tadman

+0

不错的一个!肯定会看到分类帐系统,再次感谢你的时间和耻辱,我不能赞成任何职位作为新手。 – Ros