如何存储 Either (Key a) (Key b)?
How do I store Either (Key a) (Key b)?
我有以下型号:
User
...
Group
...
Sharing
objectId (Either UserId GroupId)
在 Sharing
实体中,我想存储 UserId
或 GroupId
并区分它们。简单地使用 Either
不起作用:
- Not in scope: type constructor or class `UserId'
- Not in scope: type constructor or class `GroupId'
添加新的求和类型也不起作用:
data SharingIdType = SharingUserId UserId | SharingGroupId GroupId
- Not in scope: type constructor or class `SharingIdType'
无法将 SharingIdType
移动到另一个模块中,因为它使用 UserId
和 GroupId
类型。我看到的唯一方法是为每种共享类型创建一个实体,例如 UserSharing
/GroupSharing
.
除此之外,如何解决这个问题?
经过一段时间的搜索和思考,我总结出两种可能的解决方案:
1.
如果 SharingIdType
s 的数量是静态的或很少改变(意味着,可以重新编译源代码来改变它或改变数据库模式),处理问题的正确方法是必须每种共享类型的实体:
User
...
Group
...
UserSharing
userId UserId
GroupSharing
groupId GroupId
这里问题的"sumness"被移到了数据库查询。每当我需要找出共享的内容时,我都会创建两个 selectList
并查询两个 table 而不是一个。
2.
如果 SharingIdTypes
的数量需要动态更改,则需要 SharingType
实体:
User
...
Group
...
SharingType
description String
Sharing
objectId SharingTypeId
此 table 填充了对应于 SharingIdType
s 构造函数的值:
do
insert $ SharingType "user"
insert $ SharingType "group"
现在每当我们分享东西时,我们都会参考 SharingTypeId
。
我有以下型号:
User
...
Group
...
Sharing
objectId (Either UserId GroupId)
在 Sharing
实体中,我想存储 UserId
或 GroupId
并区分它们。简单地使用 Either
不起作用:
- Not in scope: type constructor or class `UserId'
- Not in scope: type constructor or class `GroupId'
添加新的求和类型也不起作用:
data SharingIdType = SharingUserId UserId | SharingGroupId GroupId
- Not in scope: type constructor or class `SharingIdType'
无法将 SharingIdType
移动到另一个模块中,因为它使用 UserId
和 GroupId
类型。我看到的唯一方法是为每种共享类型创建一个实体,例如 UserSharing
/GroupSharing
.
除此之外,如何解决这个问题?
经过一段时间的搜索和思考,我总结出两种可能的解决方案:
1.
如果 SharingIdType
s 的数量是静态的或很少改变(意味着,可以重新编译源代码来改变它或改变数据库模式),处理问题的正确方法是必须每种共享类型的实体:
User
...
Group
...
UserSharing
userId UserId
GroupSharing
groupId GroupId
这里问题的"sumness"被移到了数据库查询。每当我需要找出共享的内容时,我都会创建两个 selectList
并查询两个 table 而不是一个。
2.
如果 SharingIdTypes
的数量需要动态更改,则需要 SharingType
实体:
User
...
Group
...
SharingType
description String
Sharing
objectId SharingTypeId
此 table 填充了对应于 SharingIdType
s 构造函数的值:
do
insert $ SharingType "user"
insert $ SharingType "group"
现在每当我们分享东西时,我们都会参考 SharingTypeId
。