Как мне хранить Либо (Ключ 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.

Если число SharingIdTypes является статическим или редко изменяется (значит, можно перекомпилировать исходный код, чтобы изменить его или изменить схему БД), правильный способ решения проблемы - наличие сущностей для каждого типа совместного использования:

User
  ...
Group
  ...
UserSharing
  userId UserId
GroupSharing
  groupId GroupId

Здесь "сумма" проблемы переносится на запросы к БД. Всякий раз, когда мне нужно выяснить, с чем-то поделились, я делаю два selectLists и запросить две таблицы вместо одной.

2.

Если число SharingIdTypes должен быть изменен динамически, SharingType сущность нужна:

User
  ...
Group
  ...
SharingType
  description String
Sharing
  objectId SharingTypeId

Эта таблица заполнена значениями, соответствующими SharingIdTypeконструкторы:

do
  insert $ SharingType "user"
  insert $ SharingType "group"

Теперь, когда мы делимся чем-то, мы ссылаемся SharingTypeId,

Другие вопросы по тегам