Я много работал с периодами, но, боюсь, я не совсем понимаю, как таблицы А и В работают вместе, возможно, это слово включает , которое я не понимаю.
Можете ли вы привести конкретные примеры того, что вы хотите сделать?
Вы имеете в виду, что временные промежутки, записанные в таблице A, полностью содержат временные промежутки в таблице B, как это?
|---------------- A -------------------|
|--- B ----| |--- B ---|
или совпадает с?
|---------------- A -------------------|
|--- B ----| |--- B ---|
или наоборот, интервалы времени в 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?
Вот пример:
|-------------- A1 --------------| |-------- A2 --------------|
|---- B1 ----| |----- B2 ---| |---- B3 ----| |-- B4 --|
и затем вы удлиняете А1, укорачиваете и перемещаете А2, так что:
|-------------- A1 ---------------------------------| |--- A2 --|
|---- B1 ----| |----- B2 ---| |---- B3 ----| |-- B4 --|
это означает, что вы хотите изменить данные следующим образом:
1. Lengthen (update) A1
2. Shorten and move (update) A2
3. Re-link (update) B3 from A2 to A1 instead
как насчет этой модификации, A1 удлиняется, но недостаточно для полного содержания B3, а A2 перемещается / укорачивается таким же образом:
|-------------- A1 -----------------------------| |--- A2 --|
|---- B1 ----| |----- B2 ---| |---- B3 ----| |-- B4 --|
Поскольку B3 теперь не полностью находится внутри A1 или A2, удалите его?
Мне нужны конкретные примеры того, что вы хотите сделать.
Редактировать Дополнительные вопросы
Хорошо, а как же:
|------------------ A -----------------------|
|------- B1 -------| |------- B2 ------|
|---| <-- I want to remove this from A
Как насчет этого?
Или:
|------------------ A1 ----| |---- A2 -----|
|------- B1 -------| |B3| |--- B2 ---|
или
|------------------ A1 ----| |---- A2 -----|
|------- B1 -------|
Подводя итог, как я это вижу, с вопросами, пока:
- Вы хотите иметь возможность выполнять следующие операции с А
- Сократить
- удлиняет
- Объедините, когда они смежные, объединяя два или более в один
- Пробейте в них отверстия, удалив точку и, таким образом, разделив ее
- B, которые все еще содержатся в A после вышеприведенного обновления, перепривязать при необходимости
- Б, которые содержались, но теперь полностью снаружи, удалите их
- B, которые содержались, но теперь частично снаружи, Редактировать: Удалить их, ref целостность данных
- Для всех вышеперечисленных операций выполните как минимум минимальную работу, необходимую для приведения данных в соответствие с операциями (вместо того, чтобы просто удалить все и вставить заново)
Я буду работать над реализацией в C #, которая может сработать, когда я вернусь с работы, я вернусь с более поздним вечером.
Редактировать Вот пример алгоритма.
- Сначала оптимизировать новый список (т.е. объединить смежные периоды и т. Д.)
- «объединить» этот список с основными периодами в базе данных следующим образом:
- отслеживать, где в обоих списках (т. Е. Новых и существующих) вы
- если текущий новый период полностью предшествует текущему существующему периоду, добавьте его, а затем переходите к следующему новому периоду
- если текущий новый период полностью после текущего существующего периода, удалить существующий период и все его дочерние периоды, а затем перейти к следующему существующему периоду
- если два перекрываются, откорректируйте текущий существующий период, чтобы он был равен новому периоду, следующим образом, затем перейдите к следующему новому и существующему периоду.
- если новый период начинается раньше существующего, просто переместите начало
- если новый период начинается после существующего периода, проверьте, есть ли какие-либо дочерние периоды в разностном периоде, и запомните их, затем переместите начало
- сделать то же самое с другим концом
- с любыми периодами, которые вы "запомнили", посмотрите, нужно ли их повторно связать или удалить
Вам следует создать огромный набор юнит-тестов и убедиться, что вы охватили все комбинации модификаций.