处理MySQL数据集的最有效方法

时间:2012-04-08 09:04:36

标签: 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

申请规则规定,“覆盖”另一个“人”的人将在覆盖表中有一条记录。 coverage表包含“from_person_id”,它是对“覆盖”人的引用。 “to_person_id”代表另一个“接受报道”的“人”。 “人”可以覆盖另一个人,从“start_date”到“end_date”,用于“旧”或“新”或“所有”工作以及特定“地点”。任何单个“人”都不能覆盖相同的地点,日期和工作状态(全部,新旧)。

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

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条完全相同的记录。应用程序的当前状态允许插入记录,但它会在输出后覆盖现有记录。

我们希望更改此功能并向用户显示将覆盖其现有覆盖范围的覆盖范围。由于他们的新覆盖范围可能会覆盖多行。

例如,如果Person A在整个月份为place1,place2和place3提供了Person B的新工作范围。

Person A还为place1提供了Person C的覆盖率,并为整个月的所有(新/旧)工作提供了place2。

然后Person C决定Person D在place1整个月覆盖他们,而place2代替Person A仅针对老年患者。

现在,应用程序需要检测到Person A仍将覆盖Person C,但仅适用于地点和地点2的旧患者。

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

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

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

还要考虑Person A是否决定Person E在地方1为下周的旧工作覆盖他们。{/ p>

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

还要记住,将来该应用程序希望支持覆盖动态字段。因此,我可以创建一个新的“工作薪酬”字段,并为另一个人支付某些工资额。

非常感谢任何想法或建议。

1 个答案:

答案 0 :(得分:1)

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

Person
  - id
  - name

Place
  - id
  - name

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

然后,您将拥有每种类型/地点组合的唯一记录,并将一个封面替换为另一个封面更容易。

这确实意味着你的应用可能需要做一些工作来分组这些用于显示目的(即一个人覆盖所有地方的所有工作的另一个)但这比尝试分解当前数据容易得多如果你需要替换掉一点封面。