数据库 - 用户类型单个用户和组织用户的表设计

时间:2016-02-16 17:07:37

标签: mysql database database-design relational-database

我是新来的,所以请在这里忍受我。

好的,我有这个问题,用户,无论是个人用户类型(管理员)还是组织用户类型(人群),都会登录我的网站。

用户信息可能因用户类型而异(管理员可以拥有年龄,生日,名字,姓氏和其他与个人相关的信息,而组织有组织名称,创建日期,人员列表,组织状态,和其他组织相关的信息)

我还需要建立一个用户到用户的消息系统。示例是组织到个人或反之亦然,个人对个人的消息

任何人都知道我应该怎么做?任何帮助表示赞赏

与此同时

这就是我认为它的消息传递方式(目前在解决我的问题时遇到了麻烦):

TABLE Users
UserAccountNumber varchar(20) Example : 2016-02081-ORG
UserPassword varchar(20)
UserTypeID tinyint Example : 0 for admin, 1 for organizations



TABLE Message
MessageID varchar(20) Example: GF23DG2VS45G <- RANDOM GENERATED
SenderID varchar(20) <- UserAccountNumber FK
ReceiverID varchar(20) <- UserAccountNumber FK
Time_Message datetime

TABLE MESSAGE_TEXT
MessageTextID varchar(20)
MessageID <- FK
Body varchar(255) <- message Example : "Hello, how are you?"
Time_Message datetime

随意重新设计我的消息传递表设计,以帮助我改进它。

2 个答案:

答案 0 :(得分:0)

你走在正确的轨道上。为组织和人员制作一张桌子。使用帐号将它们链接回“用户”,甚至更好的是整数id字段。每条消息还应该有一个id字段,用于将消息链接到用户。然后,对于任何消息,您可以从相应的表中找到用户和用户的信息。

答案 1 :(得分:0)

请勿使用VARCHAR作为您的ID。使用INT(或bigint / long)并通过表(mysql)上的自动递增机制或序列(oracle / postgres)生成它

在您的情况下,是管理员和组织is-a用户,因此您可能需要考虑database inheritance。用户表是具有共享属性的基础。如果您没有共享属性,那么就是user_id列和type discriminator列,其值可以是“admin”或“organization”。您的管理员和组织表的主键是user_id,它也是返回给用户的外键。您可能希望在管理员和组织上有BEFORE INSERT triggers首先插入用户,并将生成的user_id注入相应的表。

管理员是否会成为该组织的官员名单?假设如此:

user
----
user_id INT AUTO_INCREMENT PRIMARY KEY
user_type VARCHAR CHECK (user_type in ('admin', 'organization')) -- This is called the discriminator
-- other shared attributes go here, if any

admin -- this extends user
----
user_id INT PRIMARY KEY REFERENCES USER (id)
first_name VARCHAR
last_name VARCHAR
age INT
birth_date DATE
organization_id INT REFERENCES organization (user_id) -- an admin belongs to an organization

organization -- this extends organization
------------
user_id INT PRIMARY KEY REFERENCS USER (id)
name VARCHAR
incorporation_date DATE

现在,对于消息传递系统。我只会将您的messagemessage文字合并为一个。

message
-------
message_id INT AUTO_INCREMENT PRIMARY KEY
parent_message_id INT UNIQUE REFERENCES message (message_id) # This lets you keep track of replies
sender_id INT REFERENCES user (user_id)
receiver_id INT REFERENCS user (user_id)
dt DATETIME
message_body TEXT

当然,如果您希望能够发送给多个人而不是只发送一个人:

message
-------
message_id INT PRIMARY KEY
parent_message_id INT UNIQUE REFERENCES message (message_id) # This lets you keep track of replies 
sender_id INT REFERENCES user (user_id)
dt DATETIME
message_body TEXT

message_receiver
---------------
message_id PRIMARY KEY REFERENCES message (message_id)
receiver_id INT PRIMARY KEY REFERENCES user (user_id)
type VARCHAR CHECK (type in ('TO', 'CC", 'BCC')) -- This would let you do an normal email To, Carbon Copy, Blind Carbon Copy if you wished