存储数据以便在我的系统中检索的最佳方法

时间:2013-07-22 22:39:44

标签: php database

我正在用PHP制作预订系统。我目前正在就数据库中存储项目的最佳方法提出一些建议。我目前有3张桌子:

Table 1 = Hire Stock (Primary Key = asset_id)

(包含特定于项目的字段,例如大小,重量,功耗

Table 2 = Project  (Primary Key = project_id)

(包含项目开始日期,结束日期,客户名称。)

Table 3 = availability  (Primary Key = asset_id)

(每次将项目添加到项目中时,都会将其与项目ID一起存储在此处)

我需要能够搜索清单中的每个项目,并在需要时检查它是否可供租用。如果我必须循环比较日期范围的每个项目,它将需要很长时间。有更好的方法来存储数据吗?搜索它的更好方法是什么?

1 个答案:

答案 0 :(得分:0)

您的架构似乎合情合理。只需正确连接表并测试您的asset_id不在分配给日期范围与您需要的新项目周期重叠的任何项目的那些项目中。 假设您已经创建了新项目并希望为其分配产品。

您想要一个类似这样的查询:

$query= "select * from Hire_Stock h ".
"Where h.asset_id not in ".
"( Select a.asset_id from availability a, Project p2, Project p1 ".
"Where p1.project_id = :new_proj ". // The id of the new/planned project
"and p2.project_id != p1.project_id ".
"and p2.end_date >= p1.start_date ".
"and p2.start_date <= p1.end_date ".
"and a.project_id = p2.project_id )";

// using oracle oci

$pok=oci_parse($conn,$query);

if (!$pok) die("Query ($query) Failed!<br>");

oci_bind_by_name($pok,':new_proj',$new_proj,-1);

$res=oci_execute($pok);

While ($hs_row=oci_fetch_array($pok),OCI_ASSOC)
(
  extract($hs_row);
  :
)