database - 应用程序内的朋友既可以是应用程序用户,也可以是非用户——如何设计数据模型?
问题描述
我正在编写一个应用程序,应用程序用户可以在该应用程序中添加他们以后可以在应用程序内共享内容的朋友。问题是他们可以添加已经在使用该应用程序的朋友(简单案例),但他们也可以添加尚未使用该应用程序但可能有一天会开始使用的人(棘手的部分)。在后一种情况下,他们可以简单地在应用程序中添加一条记录,然后通过电子邮件共享,但该记录仍需要存储在数据库中。需要提到的重要一点是,每当用户为朋友添加记录时,也会为他/她添加记录(因为他们正在共享内容,所以我还需要添加有关用户部分的信息)。
如果朋友只能是应用程序用户,那么我只需一个用户表和一个联结表来定义用户之间的多对多关系。然后,记录表可能看起来像这样:
CREATE TABLE IF NOT EXISTS Record (
record_id INT NOT NULL, -- primary key
record_col VARCHAR(45) NULL, -- some column describing the record
added_by_id VARCHAR(45) NOT NULL, -- references user_id from the User table
added_for_id VARCHAR(45) NOT NULL -- references user_id from the User table
);
但是,由于可以添加不是应用程序用户的朋友,然后可以为他们添加记录,我想我需要一个额外的表来存储有关朋友的信息:
CREATE TABLE IF NOT EXISTS Friend (
friend_id INT NOT NULL, -- primary key
friend_col VARCHAR(45) NULL, -- some column describing the friend
friend_of_user_id VARCHAR(45) NOT NULL, -- id of the user who added this friend
is_user BIT(1) NOT NULL, -- boolean indicating if this friend has already created an account
friend_user_id INT NULL -- if above is true, user_id of this friend would go here
);
但是,我该如何在 Record 表中处理这个?我可以为应用程序用户添加一些记录,为非用户添加一些记录,因此对于其中一些用户,外键将引用 user_id,其余为friend_id。这对我来说似乎不对...
我也可以尝试将每个人(应用程序用户和非用户)放在一个表中,但是对于同一个物理人(假设是 John Smith),我可能会添加多个记录,这些记录是由 John 的朋友和一个表示实际 John Smith 是应用程序用户的记录。这看起来很恶心。
我在这里想念什么?这似乎不是一件不寻常的事情,但我无法找到合适的解决方案。
解决方案
推荐阅读
- vue.js - 在 Vue 中禁用键绑定复制/粘贴
- arrays - 创建 go 结构以接受带有匿名顶级项目的 json
- javascript - 有没有办法使用 discord.js v12 记录谁删除了反应?
- ios - FirebaseMessaging getToken 在 iOS 上不起作用
- javascript - 我想添加一个记录未声明变量值的 console.log 语句。我该怎么做?
- javascript - Javascript函数检查页面上是否有视频,然后在视频持续时间内隐藏下一个按钮
- java - vertx.createHttpServer() 抛出 NullPointerException
- reactjs - 反应“类似路由器”的动画
- sql-server - 如何创建检查状态、验证然后更新状态的存储过程?
- python - 熊猫数据框中的舍入和千位分隔符:无法摆脱小数