Ada*_*ire 2 database algorithm diff
这适用于小型调度应用.我需要一种算法来有效地比较两个"时间表",找到差异,并仅更新已更改的数据行,以及另一个表中具有此表作为外键的条目.这是一个很大的问题,所以我马上就说我正在寻找一般建议或具体解决方案.
编辑:正如所建议的那样,我已经大大缩短了这个问题.
在一个表中,我将资源与使用它们的时间跨度相关联.
我还有第二个表(表B),它使用表A中的ID作为外键.
表A中对应于表B的条目将具有包含表B中的时间跨度的时间跨度.并非表A中的所有条目都具有表B中的条目.
我正在为用户提供一个界面来编辑表A中的资源调度.它们基本上为表A提供了一组新的数据,我需要将其视为数据库中版本的差异.
如果他们从表B中完全删除表A中的对象,我也想从表B中删除该条目.
因此,给出以下3组:
我需要一个算法:
只是将对象排序到我可以应用适当的数据库操作的安排中,这对于解决方案来说已经足够了.
再次,请按照您的具体或一般情况回答,我正在寻求建议,但如果有人有一个完整的算法,只会让我的一天.:)
编辑:为了回应lassvek,我提供了一些额外的细节:
表B的项目始终完全包含在表A项目中,而不仅仅是重叠.
重要的是,表B的项目是量化的,因此它们应完全落入或完全落在外面.如果没有发生这种情况,那么我有一个数据完整性错误,我必须单独处理.
例如(使用速记):
Table A ID Resource Start End 01 Resource A 10/6 7:00AM 10/6 11:00AM 02 Resource A 10/6 1:00PM 10/6 3:00PM Table B ID Table_A_ID Start End 01 02 10/6 1:00PM 10/6 2:00PM
所以我想要以下行为:
我曾经广泛地工作过一段时间,但我恐怕我完全不明白表A和B是如何协同工作的,也许这是我不明白的含义.
你能举出一些你想做的具体例子吗?
你的意思是表A中记录的时间跨度包含表B中的完全时间跨度,就像这样吗?
|---------------- A -------------------|
|--- B ----| |--- B ---|
Run Code Online (Sandbox Code Playgroud)
或重叠?
|---------------- A -------------------|
|--- B ----| |--- B ---|
Run Code Online (Sandbox Code Playgroud)
或者相反的方式,B中的时间跨度包含/与A重叠?
假设它是第一个,其中B中的时间跨度与表A中的链接时间跨度相同/相同.
这是否意味着:
* A removed A-timespan removes all the linked timespans from B
* An added A-timespan, what about this?
* A shortened A-timespan removes all the linked timespans from B that now falls outside A
* A lenghtened A-timespan, will this include all matching B-timespans now inside?
Run Code Online (Sandbox Code Playgroud)
这是一个例子:
|-------------- A1 --------------| |-------- A2 --------------|
|---- B1 ----| |----- B2 ---| |---- B3 ----| |-- B4 --|
Run Code Online (Sandbox Code Playgroud)
然后你加长A1并缩短并移动A2,这样:
|-------------- A1 ---------------------------------| |--- A2 --|
|---- B1 ----| |----- B2 ---| |---- B3 ----| |-- B4 --|
Run Code Online (Sandbox Code Playgroud)
这意味着您要修改这样的数据:
1. Lengthen (update) A1
2. Shorten and move (update) A2
3. Re-link (update) B3 from A2 to A1 instead
Run Code Online (Sandbox Code Playgroud)
如何修改,A1加长,但不足以完全包含B3,A2以相同的方式移动/缩短:
|-------------- A1 -----------------------------| |--- A2 --|
|---- B1 ----| |----- B2 ---| |---- B3 ----| |-- B4 --|
Run Code Online (Sandbox Code Playgroud)
既然B3现在不完全在A1或A2之内,那么将它删除?
我需要一些你想做的具体例子.
编辑更多问题
好的,怎么样:
|------------------ A -----------------------|
|------- B1 -------| |------- B2 ------|
|---| <-- I want to remove this from A
Run Code Online (Sandbox Code Playgroud)
那这个呢?
或者:
|------------------ A1 ----| |---- A2 -----|
|------- B1 -------| |B3| |--- B2 ---|
Run Code Online (Sandbox Code Playgroud)
要么:
|------------------ A1 ----| |---- A2 -----|
|------- B1 -------|
Run Code Online (Sandbox Code Playgroud)
到目前为止总结我如何看待它,提出问题:
我将在C#中实现一个可以在我下班回家时工作的实现,今晚我会再回来.
编辑这里是一个算法的刺.
您应该创建一组大量的单元测试,并确保涵盖所有修改组合.
| 归档时间: |
|
| 查看次数: |
457 次 |
| 最近记录: |