需要有效的数据库模型

时间:2013-05-17 18:48:59

标签: php mysql

我有一个项目,客户可以提交更改,管理员可以查看提案,接受,编辑和批准,编辑并发回给客户进行审批,或拒绝提交。

我将需要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            | 
+------+--------+-------------+------------- +

在对数据库进行大量调用时,设计目的和效率会更容易吗?

我已经开始使用第一种方法了,但它让我很头疼,但如果其他方法是相同的话我不想改变..

任何人都有意见(我确定你这样做)或其他方法?

感谢

2 个答案:

答案 0 :(得分:2)

所以,摘要:

  • deals是两个客户之间的一次性
  • clients是人
  • proposals形成deals的胆量,每deal
  • 只能有一个有效
  • proposals的状态为:approveddeclinedpendingclient需要批准
  • 以下内容需要保留所有历史记录:proposalsdeals

遵循这些准则,我会按如下方式进行设置:

<强>优惠

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)

根据需要添加时间戳。我个人会使用UPDATE触发器来执行提案版本,该触发器会在更新之前复制该行,然后相应地更新该行。这可以保证您拥有跟踪所有状态更改所需的外键集。

哦,交易中的最新提案也应该在deals表中进行更改。您也可以通过触发器来实现这一目标,让您的生活更轻松。

答案 1 :(得分:0)

我认为第一种方法会有更多的读/写操作,同时更难维护,而第二种方法更容易维护,并且可能在以后更有用(如果你需要一些来自表)\

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