假设我想要一个需要存储用户信息、图像等以及存储状态更新或帖子/评论的 Web 应用程序,我是否想要分隔表格? 例如,如果我有一个“用户”表,其中包含用户信息,如密码、电子邮件和典型的社交网络信息,如年龄、位置等。创建第二个表(“帖子”)来处理用户内容是否是个好主意例如评论和/或帖子?
表一:“用户”
- 用户名
- 用户名
- 年龄
- 等等
表二:“帖子”
- 帖子ID
- 发布内容
- 发表作者
- 发布日期
- 等等
这是一个有效的组织吗?此外,如果我想跟踪媒体,我应该在另一个表中这样做吗?
表三:“媒体”
- 身份证
- 类型
- 上传者
- 等等
非常感谢任何帮助。我很好奇我是在正确的轨道上还是完全迷路了。我主要想知道我是否应该有很多 table ,或者我是否应该有更大、更少隔离的 table 。 到目前为止还值得注意的是,我计划在“用户”表中保留诸如关注者(或 friend )之类的信息,但我不确定回想起来这是个好主意。 提前致谢,
最佳答案
一般来说,要设计一个数据库,您需要为每个要处理的对象创建一个表。在您的示例中,您有 Users
、Posts
、Comments
和 Media
。从中您可以充实您想要为每个对象存储的内容。您要存储的每个项目都是表中的一个字段:
[Users]
ID
Username
PasswordHash
Age
Birthdate
Email
JoinDate
LastLogin
[Posts]
ID
UserID
Title
Content
CreateDate
PostedDate
[Comments]
ID
PostID
UserID
Content
[Media]
ID
Title
Description
FileURI
从上面看,您可以看到用于保存每个对象信息的基本结构。通过字段名称,您甚至可以分辨出对象之间的关系。这是一个帖子有一个 UserID
所以帖子是由该用户创建的。评论有一个 PostID
和一个 UserID
,因此您可以看到评论是由某人为特定帖子撰写的。
一旦确定了一般字段,您就可以查看设计的其他一些方面。例如,现在 Users 表下的 Email
字段意味着用户可以拥有一 (1) 个电子邮件地址,仅此而已。您可以通过以下两种方式解决此问题... 添加更多电子邮件字段(EmailA、EmailB、EmailC) 如果您知道您正在处理特定类型的电子邮件,例如 EmailWork 或 EmailHome,这通常有效。如果您不知道总共有多少封电子邮件,这将不起作用。要解决这个问题,您可以将电子邮件拉出到它自己的表中:
[Users]
ID
Username
PasswordHash
Age
Birthdate
JoinDate
LastLogin
[Emails]
ID
UserID
Email
现在您可以为单个用户拥有任意数量的电子邮件。您几乎可以为您尝试设计的任何数据库执行此操作。分小步进行,根据需要将较大的对象分解成较小的对象。
更新
对待 friend 你应该考虑你正在处理的关系。一 (1) 个人有很多 friend 。关于上面的表格,它是一个用户对许多用户。这可以通过一个特殊的表来完成,该表除了您要查找的关系之外不包含任何信息。
[Friends]
[UserA]
[UserB]
因此,如果当前用户的 ID 在 A 中,则他 friend 的 ID 在 B 和 visa-verse 中。这建立了友谊,如果你是我的 friend ,那么我就是你的 friend 。如果你不是我的,我就无法成为你的 friend 。如果您想设置单向友谊的功能,您可以像这样设置表格:
[Friends]
[UserID]
[FriendID]
所以如果我们彼此都是 friend ,则必须有 2 个记录,一个是我对你的友谊,一个是你对我的友谊。
关于mysql - 用户驱动网站的数据库设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11571248/