Я думаю, что ключевой момент здесь заключается в том, нужно ли вам иметь возможность изменять «системные задачи», и это изменение должно быть отражено во всех «пользовательских задачах» ...
Если это требование (звучит разумнодля меня), ваш единственный вариант - это вариант 2 - реальный довод варианта 1 - когда вы скопировали «системную задачу» как «пользовательскую задачу», вы больше не можете сказать, связаны ли они ...
Я бы выбрал модель, похожую на эту, с 2 сущностями / таблицами:
ToDoTemplate
Integer id
String name
String description
ToDoItem
Integer id
ToDoTemplate template
Boolean completed = false
?String name = null
?String description = null
Когда вы создаете ToDoItem
, вы создаете его на основе ToDoTemplate
(возможно,пустой шаблон), и вы устанавливаете name
и description
как null
, повторно используя имя / описание шаблона ... Только если пользователь изменяет свое собственное ToDoItem
, это когда вы сохраняете это значение ...то есть
String getName() {
return this.name != null ? this.name : this.template.name;
}
Это наиболее гибкий из подходов и единственно допустимый во многих ситуациях ... Обратите внимание на то, что вы упомянули:
Минусы: созданные системой элементыдолжны сохраняться навсегда в конфигурации, даже если элемент больше не актуален для новых списков дел, потому чтоВ противном случае ссылка пользователя будет нарушена.
Это на самом деле не мошенничество - пока есть один ToDoItem
, который использует данный ToDoTemplate
, шаблон все еще актуален , и, конечно, нет никаких причинубрать это ...