Как мне хранить Либо (Ключ a) (Ключ b)?
У меня есть следующая модель:
User
...
Group
...
Sharing
objectId (Either UserId GroupId)
В Sharing
сущность, которую я хочу хранить либо UserId
или же GroupId
и различать их. Просто используя Either
не работает:
- Не в области видимости: конструктор типа или класс `UserId'
- Не в области видимости: конструктор типа или класс `GroupId'
Добавление нового типа суммы также не работает:
data SharingIdType = SharingUserId UserId | SharingGroupId GroupId
- Не в области видимости: конструктор типа или класс `SharingIdType'
перемещение SharingIdType
в другой модуль не возможно, потому что он использует UserId
а также GroupId
типы. Единственный способ, которым я вижу, - это создать сущность для каждого типа совместного использования, например UserSharing
/GroupSharing
,
Кроме этого, как подойти к этой проблеме?
1 ответ
Поработав некоторое время и подумав об этом, я пришел к выводу, что есть два возможных решения:
1.
Если число SharingIdType
s является статическим или редко изменяется (значит, можно перекомпилировать исходный код, чтобы изменить его или изменить схему БД), правильный способ решения проблемы - наличие сущностей для каждого типа совместного использования:
User
...
Group
...
UserSharing
userId UserId
GroupSharing
groupId GroupId
Здесь "сумма" проблемы переносится на запросы к БД. Всякий раз, когда мне нужно выяснить, с чем-то поделились, я делаю два selectList
s и запросить две таблицы вместо одной.
2.
Если число SharingIdTypes
должен быть изменен динамически, SharingType
сущность нужна:
User
...
Group
...
SharingType
description String
Sharing
objectId SharingTypeId
Эта таблица заполнена значениями, соответствующими SharingIdType
конструкторы:
do
insert $ SharingType "user"
insert $ SharingType "group"
Теперь, когда мы делимся чем-то, мы ссылаемся SharingTypeId
,