php - 处理 MySQL 数据集的最有效方式

标签 php mysql database data-structures kohana

想象以下表格。

Person
    - id
    - name

Place
    - id
    - name

Coverage
    - id
    - from_person_id
    - to_person_id
    - new
    - old
    - start_date
    - end_date
    - closed

CoveragePlaces
    - id
    - coverage_id
    - place_id

应用程序的规则规定,“为另一个人”提供服务的“人”将在承保范围表中有一条记录。覆盖表包含“from_person_id”,它是对“覆盖”人员的引用。 “to_person_id”代表正在“接受报道”的另一个“人”。一个“人”可以为另一个人提供从“开始日期”到“结束日期”的“旧”或"new"或“所有”工作以及特定“地点”的工作。没有一个“人”可以覆盖相同的地点、日期和工作状态(所有、旧的或新的)。

截至目前,我们的数据存储方式与上述非常相似。选择查找当前为另一个人提供保险的人时。我们会做这样的事情。

SELECT
    coverage.to_user_id AS user_id
FROM
    coverage
INNER JOIN
    coverage_places
        ON ( coverage.id = coverage_places.coverage_id AND coverage_places.place_id = 10 )
WHERE
    coverage.from_user_id = 150 AND
    coverage.new = 1

尽管申请规则规定任何人都不能拥有 2 条覆盖范围相同的记录。应用程序的当前状态允许插入记录,但它会在输出后覆盖现有记录。

我们想要更改此功能并向用户显示哪些覆盖范围将被他们现有的覆盖范围取代。因为他们的新覆盖范围可能会覆盖多行。

例如,如果 A 人 整个月都在 place1、place2 和 place3 为 PersonB 提供新工作。

人员 A 还为 人员 C 的地点 1 和地点 2 提供整个月的所有(新/旧)工作。

然后 C 决定 D 在 place1 为他们掩护整个月,而 place2 只代替 Person A对于老年患者。

现在应用程序需要检测 Person A 仍将覆盖 Person C,但仅限于 place 和 place2 的老年患者。

上面解释的覆盖率记录(在输入人员记录之前)如下。

coverage_places
    coverage_id place_id
    1 1
    1 2
    1 3
    2 1
    2 2
coverage
    id from_user_id to_user_id
    1 1 2 
    2 1 3
places
    id name
    1 place1
    2 place2
    3 place3
person
    id name
    1 persona
    2 personb
    3 personc
    4 persond

现在应用程序需要显示它要替换的记录。如果用户确认他们想要覆盖此覆盖范围,则应用程序需要修改或删除旧覆盖范围并插入新覆盖范围。

还要考虑 A 是否决定让 E 在 place1 替他们代劳下周的旧工作。

我们目前有一个与上述工作非常相似的模型,其中在编程端完成了大量逻辑,以查找重叠的覆盖范围并不仅显示重叠的记录,还显示重叠的记录片段。代码变得非常复杂。我决定退后一步,看看是否有更简单/更有效的方法。

另请记住,应用程序希望在未来支持覆盖范围的动态字段。所以我可以创建一个新字段“工作薪酬”,并让另一个人支付一定的薪酬金额。

如有任何想法或建议,我们将不胜感激。

最佳答案

由于所提供的实际封面似乎是针对地点和工作类型的组合,因此我会考虑重新设计您的模型以反射(reflect)这一点。我会建议这样的事情

Person
  - id
  - name

Place
  - id
  - name

Coverage
  - id
  - from_person_id
  - to_person_id
  - coverage_type
  - place_id
  - start_date
  - end_date
  - closed

然后,您将为每种类型/地点组合拥有唯一的记录,并且将一个覆盖物替换为另一个覆盖物会容易得多。

这确实意味着您的应用程序可能需要做一些工作来将这些数据分组以用于显示目的(即,一个人在所有地方的所有工作中覆盖另一个人)但这比尝试分解当前数据要容易得多如果您需要替换一些掩体。

关于php - 处理 MySQL 数据集的最有效方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10061682/

相关文章:

php - preg_match 所有第一次出现并在文件中获得两个匹配项

mysql - 是否可以在工作台中编辑查询结果?

php - 发生数据库错误错误号 : 1055

android - SQLite 数据库查询非常慢(SQLite Asset Helper)

php - 如何将选定值从选择框传递到研究

php - 在 woocommerce 3 中创建新的运输方式

php - 如果用户的积分超过 10,000,他们会获得 5 级,但他们会获得 1 级? mysql逻辑错误?

php - 在 PHP 7 中处理 foreach by-ref

php - MySQL返回相同数据的不同行

database - Oracle中如何将varchar转换为number