Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 需要高效的数据库模型_Php_Mysql - Fatal编程技术网

Php 需要高效的数据库模型

Php 需要高效的数据库模型,php,mysql,Php,Mysql,我有一个项目,客户可以提交更改,管理员可以查看建议,或者接受、编辑并批准、编辑并发送回客户以供批准,或者拒绝它们 我将需要2组数据,这将是一个噩梦,因为我想保留原来的建议时,编辑已作出,以防有人不喜欢的编辑,并希望恢复到原来的 这是我目前的系统,我认为需要更有效,我需要一个更好的想法 我需要每个字段的状态,因为我想确切地看到哪个字段被编辑过 mySQL Table proposal_deal +----------+------------+--------------+--------

我有一个项目,客户可以提交更改,管理员可以查看建议,或者接受、编辑并批准、编辑并发送回客户以供批准,或者拒绝它们

我将需要2组数据,这将是一个噩梦,因为我想保留原来的建议时,编辑已作出,以防有人不喜欢的编辑,并希望恢复到原来的

这是我目前的系统,我认为需要更有效,我需要一个更好的想法

我需要每个字段的状态,因为我想确切地看到哪个字段被编辑过

mySQL

Table  proposal_deal 

+----------+------------+--------------+--------------+--------------+
|  deal_id | name       |name_status   | price        | price_status |
+----------+------------+--------------+--------------+--------------+
|  1       | deal 1     | 1            |12.00         | 1            |    
+----------+------------+------------- +--------------+--------------+

Table  deal 

+------+---------+-----------+--------------+
| id   |deal_id | name       |price         | 
+------+--------+------------+--------------+
|  1   | 1      | deal 1     |12.00         | 
+------+--------+------------+------------- +
这些表有很多字段,因此也有很多状态列。我想知道一个更好的方法是否是添加第三个名为status的表,该表将容纳所有字段状态信息,如下所示

mySQL 

Table  proposal_deal

+----------+------------+-------------+
|  deal_id | name       |price        |
+----------+------------+-------------+
|  1       | deal 1     |12.00        |   
+----------+------------+-------------+

Table  deal 

+------+---------+-----------+--------------+
| id   |deal_id | name       |price         | 
+------+--------+------------+--------------+
|  1   | 1      | deal 1     |12.00         | 
+------+--------+------------+------------- +

Table status 

+------+--------+-------------+--------------+
| id   |deal_id | column_name |status        | 
+------+--------+-------------+--------------+
|  1   | 1      | name        | 1            | 
+------+--------+-------------+------------- +
在对数据库进行大量调用时,对于设计目的和效率来说,什么更容易

我已经从第一种方法开始了,但是它让我头疼,但是如果另一种方法是一样的,我不想改变

有人有意见吗?我肯定你有,还是有其他方法


谢谢

我认为第一种方法会使很多读/写操作变得更好,同时也更难维护,而第二种方法更容易维护,如果您以后需要表中的一些统计数据,它可能会证明自己更有用\

如果您更喜欢第一种方法,我个人会选择第二种或mongodb或类似方法。

因此,总结:

交易是两个客户之间的一次性交易 客户是人 提案构成了交易的核心,每笔交易只能有一个活跃的提案 提案的状态为:已批准、已拒绝、待定。客户需要批准它们 所有历史都需要保存在以下方面:提案、交易 根据这些指导原则,我将按如下方式设置:

交易

提议

地位

添加您认为合适的时间戳。我个人会使用一个更新触发器来执行建议版本,该触发器会在更新之前复制行,然后相应地更新行。这保证您拥有跟踪所有状态更改所需的外键集


哦,交易中的最新提议也应该在交易表中更改。您也可以使用触发器来实现这一点,以使您的生活更轻松。

目前来看,这个问题不适合我们的问答形式。我们希望答案能得到事实、参考资料或特定专业知识的支持,但这个问题可能会引发辩论、争论、投票,如果您正在使用某种ORM库,那么在更新之前将时间戳/负责人副本保存到另一个表中可能会更容易。我们都需要一个高效的数据库模型!从第三范式开始。然后使用EXPLAIN找出查询需要哪些索引。Thans man,我喜欢这种方法,我没有触发器方面的经验,所以我想我必须对此做更多的阅读。为什么我还想在哪里使用时间戳?@vinylDeveloper:我个人会将created_at和modified_at时间戳添加到status、proposal和deal中。这是为了告诉您什么时候添加和修改了内容。触发器:。它们实际上是基于另一个动作发生的自动动作。在本例中,更新如果我想要提案表中每个字段的状态,您将如何设置?这样我就可以准确地跟踪编辑的字段。不仅仅是整个交易?@vinylDeveloper:创建一个历史记录表,在更新提案时触发。每当更新完成时,在历史记录中插入一行。
id
name
proposal_id (FK proposals.id, UPDATE:CASCADE, DELETE:SETNULL)
client_id (FK clients.id, UPDATE:CASCADE, DELETE:SETNULL)
company_id (FK clients.id UPDATE:CASCADE, DELETE:SETNULL)
id
name
price
(more data fields)
modified_by (FK clients.id UPDATE:CASCADE, DELETE:SETNULL)
id
proposal_id (FK proposals.id UPDATE:CASCADE, DELETE:RESTRICT)
status
modified_by (FK clients.id UPDATE:CASCADE, DELETE:RESTRICT)