用户驱动的网站的数据库设计

时间:2012-07-20 00:28:17

标签: mysql database database-design social-networking

假设我想要一个需要存储用户信息,图像等的Web应用程序以及存储状态更新或帖子/评论,我想要分离表吗? 例如,如果我有一个"用户"包含用户信息的表格,如密码,电子邮件和典型的社交网络信息,如年龄,位置等。最好创建第二个表(" posts")来处理用户内容,如评论和/或发布?

表一:"用户"

  • UserID
  • 用户名
  • 年龄

表二:"帖子"

  • 帖子ID
  • PostContent
  • PostAuthor

这是一个有效的组织吗?此外,如果我想跟踪媒体,我应该在另一张表中这样做吗?

表三:"媒体"

  • ID
  • 类型
  • 上传

非常感谢任何帮助。我很好奇,看看我是在正确的轨道上还是完全迷失了。我主要想知道我是否应该有很多桌子,或者我是否应该有更大的隔离表。 另外值得注意的是,到目前为止,我计划在“用户”中保留关注者(或朋友)等信息。但是我不确定回想起来是个好主意。 提前谢谢,

2 个答案:

答案 0 :(得分:3)

一般来说,为了设计数据库,您需要为要处理的每个对象创建一个表。在您的示例中,您有UsersPostsCommentsMedia。从那里你可以充实你想要为每个对象存储的内容。您要存储的每个项目都是表格中的一个字段:

[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所以帖子是由该用户创建的。评论有PostIDUserID,因此您可以看到评论是由某人为特定帖子撰写的。

一旦确定了常规字段,您就可以查看设计的其他一些方面。例如,现在Users表下的Email字段意味着用户可以拥有一(1)个电子邮件地址,而不是更多。您可以通过以下两种方式解决此问题...添加更多电子邮件字段(EmailA,EmailB,EmailC)如果您知道有特定类型的电子邮件正在处理,这通常有效,例如EmailWork或EmailHome。如果您不知道总共会有多少封电子邮件,则此功能无效。要解决此问题,您可以将电子邮件发送到自己的表中:

[Users]
ID
Username
PasswordHash
Age
Birthdate
JoinDate
LastLogin

[Emails]
ID
UserID
Email

现在,您可以为单个用户提供任意数量的电子邮件。您可以针对您尝试设计的任何数据库执行此操作。按照小步骤进行操作,根据需要将较大的物体分成较小的物体。

更新

要与朋友打交道,你应该考虑你正在处理的关系。有一(1)个人有很多朋友。关于上面的表,其中一个用户对多个用户。这可以通过一个特殊的表来完成,该表不包含您正在寻找的关系以外的任何信息。

[Friends]
[UserA]
[UserB]

因此,如果当前用户的ID在A中,他的朋友的ID在B和签证中。这建立了友谊,如果你是我的朋友,那么我就是你的朋友。没有你是我的,我没办法成为你的朋友。如果你想设置单向友谊的能力,你可以像这样设置表:

[Friends]
[UserID]
[FriendID]

所以,如果我们彼此都是朋友,那么就必须有2条记录,一条是我与你的友情,另一条是你的朋友。

答案 1 :(得分:1)

您需要使用多个表格。

表的数量取决于您希望交互式网站的复杂程度。根据您发布的内容,您需要一个用于存储用户信息的表,一个用于注释的表,以及一个用于存储状态类型的表。

例如tbl_Users应该存储: 1.用户ID 2.名字 3.姓氏 4.电子邮件 5.密码(加密) 6.地址 7.城市 8.国家 9.国家 10.出生日期 11. UserStatus 12.等等

这个项目听起来应该是使用关系数据库来提取相关用户ID的记录,例如评论。

这意味着您需要一个存储以下内容的表: 1. CommentID(主键,int,自动增量) 2.评论(文字) 3. UserID(外键,int)

注释通过外键附加到用户,该外键实际上是来自tbl_Users表的userId。您需要将SQL语句中的这些表与脚本组合,以将信息作为单个信息进行查询。参见示例代码

$sql_userWall = "SELECT tbl_Users.*, tbl_Comments.*, tbl_userStatus FROM tbl_Users
INNER JOIN tbl_Comments ON tbl_Users.userID = tbl_Comments.userID
INNER JOIN tbl_UserStatus ON tbl_Users.userID = tbl.UserStatus
WHERE tbl_Users.userID = $userID";

这句话基本上是说从users表中获取所提供用户的信息,并获得附加了相同userID的所有注释,并从用户状态表中获取userStatus。

因此,您需要一个名为tbl_userStatus的表,该表包含唯一的statusID(主键,int,自动递增)以及确定长度的文本(varchar),例如“在线”或“离线”。当您开始使用php,asp或类似语言从e记录中写出信息时,表格将自动从tbl_userStatus中检索信息,只需使用简单的行,如

<?php echo $_REQUEST['userStatus']; ?>

无需额外的工作。大部分项目时间都用于开发数据库结构和编写SQL语句,以正确检索每个页面所需的信息。

有许多精彩的YouTube视频系列描述了关系型DBS和绘图实体关系图。这是您应该了解的有关创建您正在描述的项目的更多信息。

最后一点,如果您希望对组的所有成员都可以看到注释,这将描述所谓的多对多关系,这需要额外的表以允许多个用户“拥有”关系到一张桌子。您可以存储一个引用组表的groupID。

tbl_groups 1. GroupID 2. GroupName 3.更多组信息等

为该组注册的用户表 Tbl_groupMembers 1. membershipCountID(主键,int,自动增量) 2. GroupID(foriegn key,int) 3. UserID(foriegn key,int)

这允许用户注册一个组,并将内部联系到基于组的注释。这些关系需要花费更多时间来理解,视频将有很大帮助。

我希望这会有所帮助,我会稍后回来发布一些YouTube链接,我发现这些内容很有帮助。