【问题标题】:Best Way to Store data for retrieval in my system在我的系统中存储数据以进行检索的最佳方式
【发布时间】:2015-12-27 20:15:22
【问题描述】:

我正在用 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 一起存储在这里)

我需要能够搜索库存中的每件物品,并在需要时检查它是否可供出租。如果我必须遍历比较日期范围的每个项目,那将需要很长时间。有没有更好的方法来存储数据?更好的搜索方式?

【问题讨论】:

  • 在项目期间消耗一个租用物品?对我来说,可用性听起来更像是 AssignedToProject 并且似乎有点令人困惑 - 这是预期的目标吗?此外,“比较日期范围”可能是“使用带有 [index-based] 范围比较的 SQL 集合操作”,因此这里不一定要“花费时间”。更复杂的操作是查找哪些范围空闲的,而不是查找范围的重叠(或一组范围上的单个范围)。
  • 编程的第一条规则:先让它工作,然后再优化。我建议你先试试你的方法,看看性能是否很糟糕,然后再优化。同样尝试在设计数据时考虑到代码可能不是一个好主意:它会在模型​​和代码之间创建依赖关系,因此当您必须修改代码时,您会开始担心模型是否损坏.最后对于文本搜索考虑使用 Sphinx,对于其他使用普通 SQL 的 go,只需施加更多限制,例如用户必须指定日期范围。

标签: php database


【解决方案1】:

您的架构似乎很明智。只需正确加入表格并测试您的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);
  :
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 2016-07-19
    • 2020-07-09
    • 1970-01-01
    • 2012-09-24
    相关资源
    最近更新 更多