0

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

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,

上表处理系统中是否存在母亲

关于母亲表(第 2 例):-

  `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 将为不存在的 Null,如果它是通用注释,则 ID 和 Mother's name 将为空。有人能给我最好的设计方法吗?

谢谢你

问候

基兰

4

1 回答 1

1

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

在此处输入图像描述

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

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
)

用简单的英语:选择那些至少是一个人的母亲的人。

您需要 MOTHER_ID 上的索引以优化执行此查询(某些数据库会自动在外键上创建索引)。

- - 编辑 - -

如果用户可以写很多关于母亲的记忆,设计可能是这样的:

在此处输入图像描述

不幸的是,这确实允许非用户写入内存的情况。如果您绝对必须避免这种情况,请使用可以使用 NULL-able UNIQUE 约束作为外键的父端点的数据库,并使用 USER_NAME 而不是 PERSON_ID 来连接表,或者如果您不介意一些复杂性,请执行这个:

在此处输入图像描述

符号:在此处输入图像描述表示类别(又名继承、泛化层次结构等),但在这个特定模型中有一个转折点:一个 PERSON 既可以是 USER 又可以是 MOTHER(即,这就是所谓的“非歧视”类别)。

于 2012-05-25T14:33:26.067 回答