1

我有以下模型:

User
  ...
Group
  ...
Sharing
  objectId (Either UserId GroupId)

Sharing实体中,我想存储UserIdGroupId区分它们。简单地使用Either不起作用:

  • 不在范围内:类型构造函数或类“UserId”
  • 不在范围内:类型构造函数或类“GroupId”

添加新的 sum 类型也不起作用:

data SharingIdType = SharingUserId UserId | SharingGroupId GroupId
  • 不在范围内:类型构造函数或类“SharingIdType”

移动SharingIdType到另一个模块是不可能的,因为它使用UserIdGroupId类型。我看到的唯一方法是为每种共享类型创建一个实体,例如UserSharing/ GroupSharing

除此之外,如何解决这个问题?

4

1 回答 1

0

在搜索了一段时间并考虑之后,我得出结论有两种可能的解决方案:

1.

如果SharingIdTypes 的数量是静态的或很少更改(意味着可以重新编译源以更改它或更改 DB 模式),则处理问题的正确方法是必须为每种共享类型设置实体:

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

在这里,问题的“总和”被转移到数据库查询中。每当我需要找出共享的内容时,我都会创建两个selectLists 并查询两个表而不是一个表。

2.

如果SharingIdTypes需要动态更改数量,SharingType则需要实体:

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

该表填充了对应于SharingIdTypes 个构造函数的值:

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

现在,每当我们分享某些东西时,我们都会引用SharingTypeId.

于 2018-03-28T05:55:35.473 回答