Database design 数据库设计-写一些关于现有用户或非现有用户或一般用户的东西

Database design 数据库设计-写一些关于现有用户或非现有用户或一般用户的东西,database-design,Database Design,我正在开发一个与母亲有关的网站。任何人都可以注册到该网站,可以写关于他母亲的文章或关于母亲的一般评论 `user_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `user_name` varchar(25) CHARACTER SET latin1 NOT NULL, `surname` varchar(30) CHARACTER SET latin1 NOT NULL, `name` varchar(30) CHARACTER SET

我正在开发一个与母亲有关的网站。任何人都可以注册到该网站,可以写关于他母亲的文章或关于母亲的一般评论

 `user_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_name` varchar(25) CHARACTER SET latin1 NOT NULL,
  `surname` varchar(30) CHARACTER SET latin1 NOT NULL,
  `name` varchar(30) CHARACTER SET latin1 NOT NULL,
1) 母亲也可以是用户的一部分(注册用户表)

2) 若注册用户表中不存在她,那个么用户必须写下他母亲的名字

3) 与母亲无关,只是写一些关于母亲的一般性话题

用户表:-

 `user_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_name` varchar(25) CHARACTER SET latin1 NOT NULL,
  `surname` varchar(30) CHARACTER SET latin1 NOT NULL,
  `name` varchar(30) CHARACTER SET latin1 NOT NULL,
关于母亲表(第一种情况):-

  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `mother_id` int(10) unsigned NOT NULL,  ( user_id of the above table)
  `subject` varchar(150) NOT NULL,
  `details` text NOT NULL,
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `mother_name` varchar(50) unsigned NOT NULL,  
  `subject` varchar(150) NOT NULL,
  `details` text NOT NULL,
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `subject` varchar(150) NOT NULL,
  `details` text NOT NULL,
上表涉及系统中是否存在母亲

关于母亲表(第二种情况):-

  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `mother_id` int(10) unsigned NOT NULL,  ( user_id of the above table)
  `subject` varchar(150) NOT NULL,
  `details` text NOT NULL,
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `mother_name` varchar(50) unsigned NOT NULL,  
  `subject` varchar(150) NOT NULL,
  `details` text NOT NULL,
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `subject` varchar(150) NOT NULL,
  `details` text NOT NULL,
上表说明了系统中是否不存在母亲

关于母亲表(第三种情况):-

  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `mother_id` int(10) unsigned NOT NULL,  ( user_id of the above table)
  `subject` varchar(150) NOT NULL,
  `details` text NOT NULL,
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `mother_name` varchar(50) unsigned NOT NULL,  
  `subject` varchar(150) NOT NULL,
  `details` text NOT NULL,
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `subject` varchar(150) NOT NULL,
  `details` text NOT NULL,
上表涉及的是关于母亲的一般情况

现在显示不同的母亲列表(首先是最近的母亲,而不是关于母亲的详细信息)

我必须将first mothers表与users表合并以获得名称,并且必须与Second mothers表合并并按日期递减

如果我必须显示有关母亲的详细信息

 `user_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_name` varchar(25) CHARACTER SET latin1 NOT NULL,
  `surname` varchar(30) CHARACTER SET latin1 NOT NULL,
  `name` varchar(30) CHARACTER SET latin1 NOT NULL,
我有三张按日期递减的表

我觉得我把事情弄得很复杂

若我将三个表合并到一个表中,那个么ID将为Null,因为它不存在,若它是一个通用注释,那个么ID和母亲的名字将为Null。有人能给我最好的设计方法吗

多谢各位

问候


Kiran

由于母亲也可以是用户,并且假设每个孩子最多可以写一条关于母亲的评论,看起来您需要这样的东西:

SELECT *
FROM PERSON T1
WHERE EXISTS (
    SELECT *
    FROM PERSON T2
    WHERE T1.PERSON_ID = T2.MOTHER_ID
)

您需要限制某些字段的可空性,以确保如果某人有母亲,则此人是注册用户(有用户名),并且主题和描述存在:

CHECK (
    (MOTHER_ID IS NULL AND MOTHER_SUBJECT IS NULL AND MOTHER_DETAILS IS NULL)
    OR (USER_NAME IS NOT NULL AND MOTHER_ID IS NOT NULL AND MOTHER_SUBJECT IS NOT NULL AND MOTHER_DETAILS IS NOT NULL)
)
为了让所有人都是母亲,你可以这样做:

SELECT *
FROM PERSON T1
WHERE EXISTS (
    SELECT *
    FROM PERSON T2
    WHERE T1.PERSON_ID = T2.MOTHER_ID
)
用通俗易懂的英语:选择至少一个人的母亲

您需要一个关于母亲ID的索引来优化此查询的执行(一些数据库会自动在外键上创建索引)

---编辑--- 如果用户可以写很多关于母亲的记忆,那么设计可以如下所示:

SELECT *
FROM PERSON T1
WHERE EXISTS (
    SELECT *
    FROM PERSON T2
    WHERE T1.PERSON_ID = T2.MOTHER_ID
)

不幸的是,这确实允许非用户写入内存的情况。如果必须避免这种情况,请使用可以使用NULL-able-UNIQUE-constraint作为外键的父端点的数据库,并使用USER\u-NAME而不是PERSON\u-ID来连接表,或者如果您不介意出现一些复杂情况,请执行以下操作:


符号:表示类别(又称继承、泛化层次等),但在这个特殊的模型中有一个转折点:一个人既可以是用户也可以是母亲(即,这就是所谓的“非歧视性”类别)。

谢谢您的回答。对不起,如果我的问题让人困惑的话。。如果系统中没有母亲,用户应提供她的姓名和详细信息。在你提到的上述设计中,我无法多次书写我与母亲的回忆。用户应该能够写尽可能多的关于他的评论(或记忆)mother@Bujji当你说:“如果系统中没有母亲,用户应该提供她的姓名和详细信息。”时,我不确定是什么问题,请澄清。至于多个记忆,请看我的编辑。谢谢你的更新。对于你的问题,我的意思是如果母亲不是系统的用户。例如,我的母亲已经不在了,她不能进入系统,而对于50岁老人的母亲来说,大约70%的母亲不懂电脑,她们也不能进入系统。所以那个时候我只是给她起了个名字,写了一些关于她的回忆。谢谢Kiran@Bujji这就是为什么USER_NAME可以为NULL(在前两个模型中),并且不必在最后一个模型中同时插入USER和MOTHER。母亲仍然是人,你必须以某种方式追踪适当的信息。我展示的模型使您能够避免在母亲也是用户的情况下重复公共字段,但不要求所有母亲都必须是用户。当你输入母亲的名字时,你必须搜索现有的母亲,看看其中一个是否可以“重用”,或者是否可以插入新的人。但是你应该想想,如果只是名字/姓氏就足够了。谢谢你更新并给我这个设计。