在我的应用程序中有两种类型的用户,匿名用户和经过身份验证的用户。经过身份验证的用户id为integer,匿名用户id为uuid。有一个表Item其存储用户所拥有的项目。关于如何在一张表中存储不同的id,我有两个想法首先创建列user_id
作为字符串,并将两个用户ID存储在一列中:
Item
+---------+----------------------------------------+----------+
| item_id | user_id | quantity |
+---------+----------------------------------------+----------+
| 1 | '1' | 2 |
| 2 | 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11' | 3 |
| 3 | '2' | 1 |
+---------+----------------------------------------+----------+
其次创建两个不同的列user_id
(整数(和anon_user_uuid
(uuid(,
Item
+---------+---------+----------------------------------------+----------+
| item_id | user_id | anon_user_uuid | quantity |
+---------+---------+----------------------------------------+----------+
| 1 | 1 | null | 2 |
| 2 | null | 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11' | 3 |
| 3 | 2 | null | 1 |
+---------+---------+----------------------------------------+----------+
在第一种情况下,我需要编写四个查询来检索、更新、创建和删除项目。
在第二节中,我需要为crud操作编写八个查询。
所以,我的问题是,像第一种情况(上面的第一个表(一样进行设计可以吗?
看起来有两种完全不同类型的值。在这种情况下,两列是合适的。
将它们作为一列的原因是,您可以设置外键或其他关系,但如果其中一些不能像那样匹配,则这是不可能的。
为了一致性,您可能希望给每个用户一个";匿名的";ID并在内部使用。其中一些可能会映射到注册用户,其他可能不会。
也可以只为匿名用户创建一个用户记录,如果用户在事后注册,只需填充其他字段并将状态更改为";注册";。