Добре, ето,
Предполагам, че създавате приложението си с Spring Boot, Hibernate като ваш ORM и вероятно някаква или релационна база данни (MySQL).
Относно db дизайна:
Да, обектът Patreon тук е обектът-притежател с връзка OneToMany към обекта Item (тъй като един Patreon може да има N обекта). Вашият обект Patreon може да направи следното преоформяне:
1) Опитайте се да използвате непримитивни типове, особено за ключове на таблица (дълъг идентификатор -> Дълъг идентификатор).
2) Загубете масива от checkedOutItems, както и списъка itemHistory. Преди всичко релациите трябва да се моделират с помощта на колекции, а не масиви. Второ, нямате нужда от тези две. Никога няма да съхранявате checkedOutItems, нито itemHistory по този начин. Вместо това създайте List<Item> items
който ще съхранява елементите на Patreon, докато описва връзката (ето няколко примера:http:/ /www.baeldung.com/hibernate-one-to-many
)
3) Отново с обекта Item трябва да загубите масива от история. Единственото нещо, от което се нуждаете там, е препратка към обекта-притежател (в този случай Patreon), като по този начин завършва страната ManyToOne на релацията.
4) Имайте предвид, че полетата за дата трябва да бъдат анотирани с @Temporal
също така предоставя правилния тип (можете да прочетете повече).
5) Класът на елемента като цяло трябва да се направи с редизайн.
5) След като всичко по-горе е на мястото си и ако приемем, че използвате Spring, можете да създадете хранилище, с което можете да заявите обект на Patreon, като по този начин извлечете обект заедно със свързаните с него обекти (елементи).
Относно вашите въпроси:
Q1:Да, вижда се. Вижте по-горе за повече.
Q1.2:Няма масиви не са. Списъците или още по-добре Комплектите са по-подходящи.
Q1.3:Да, има. Първата е JPA анотация, използвана в релационни бази данни, докато втората е специфична анотация за Spring Data, използвана от бази данни и рамки, които не са от този тип (релационни) или нямат дефиниран стандартен API за постоянство (като JPA). Защото NonNull и NotNull са приблизително еднакви, като първият всъщност замества последния (нещо, което се прави често). Единствената разлика, която виждам, е целта. Можете да прочетете повече тук:https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/lang/NonNull.html https://docs.oracle.com/javaee /7/api/javax/validation/constraints/NotNull.html
Q2:Да, има. Вижте по-горе.
В3:С малко умен дизайн не виждам нужда от повече, но ако смятате, че ще ви помогне, защо не. Просто не прекалявайте с дизайна и неговата сложност