【问题标题】:Questionable Normalizing有问题的规范化
【发布时间】:2013-01-25 20:42:35
【问题描述】:

我是设计数据库和 MySQL 的新手

所以为了简短起见,我所掌握的信息是AppId, Last Name, First Name, Gender, Age, DoB, Relation, School Name, School Address, School Phone Number, Teachers, Councilers, If they are in childcare (AppID为正在提交的应用ID)

基本上这就是我如何看待所有事情的确定以及应该创建哪些表以最规范化

AppID -> Child ID
childID -> Last Name, FirstName, Gender, Age, DoB, Relation, School Name, Grade, Child Care
School Name -> Address School, School Phone Number, teacherID,counselorID
teacherID -> First Name, Last Name, Course
CounselorID -> First Name, Last Name, Counselor type

但是我不确定尝试完全规范化这是否是一个好主意,因为这是我正在帮助的一个相当小的小组,这可能会导致加入表格需要比常规分组查找更长的时间,并且可能占用更多时间空间。

另一个问题是 MySQL 只允许 1 个自动增量变量,我可以在查询中定义类似的东西,但如果可能的话,我宁愿不必这样做。 2 个增量将是teacherID 和 CouncelorID

所以任何意见将不胜感激

编辑:这是基本结构,稍后还会添加修改属性,暂时放弃课程。谢谢

   CREATE TABLE `Client_Child_Info` (
      `FirstName` varchar(15) NOT NULL,
      `LastName` varchar(15) NOT NULL,
      `Gender` tinyint(1) NOT NULL,
      `Age` tinyint(4) NOT NULL,
      `DoB` date NOT NULL,
      `Relation` varchar(15) NOT NULL,
      `Grade` varchar(3) NOT NULL default 'NA',
      `ChildCare` tinyint(1) NOT NULL default '0',
      `ChildID` int(11) NOT NULL auto_increment,
      PRIMARY KEY  (`ChildID`),
      KEY `Age` (`Age`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Basic Child Information' AUTO_INCREMENT=1 ;

    CREATE TABLE `Client_Child_Schoolinfo` (
      `SchoolID` int(11) NOT NULL,
      `SchoolName` varchar(50) NOT NULL,
      `SchoolAddress` varchar(50) default NULL,
      `SchoolPhone` varchar(15) default NULL,
      PRIMARY KEY  (`SchoolID`),
      KEY `SchoolName` (`SchoolName`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='School Information for a given ID ';

    CREATE TABLE `Client_child_teacher` (
      `TeacherID` int(11) NOT NULL,
      `FirstName` varchar(15) NOT NULL,
      `LastName` varchar(15) NOT NULL,
      `Guidance` tinyint(1) NOT NULL COMMENT 'determines if the person is a guidance councilor or teacher',
      PRIMARY KEY  (`TeacherID`),
      KEY `Guidance` (`Guidance`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Teacher information';

    CREATE TABLE `Client_RTchild` (
      `AppID` int(11) NOT NULL,
      `ChildID` int(11) NOT NULL auto_increment,
      PRIMARY KEY  (`ChildID`),
      KEY `AppID` (`AppID`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Reference Table Applicant to Client' AUTO_INCREMENT=1 ;

    CREATE TABLE `Client_RTteacher` (
      `SchoolID` int(11) NOT NULL,
      `TeacherID` int(11) NOT NULL,
      PRIMARY KEY  (`TeacherID`),
      KEY `SchoolID` (`SchoolID`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Reference Table for teacher to school ';

    CREATE TABLE `Client_RTschool` (
      `ChildID` int(11) NOT NULL,
      `SchoolID` int(11) NOT NULL auto_increment,
      PRIMARY KEY  (`SchoolID`),
      KEY `ChildID` (`ChildID`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Reference Table Child to SchoolID it is attending' AUTO_INCREMENT=1 ;

ALTER TABLE `Client_Child_Info`
  ADD CONSTRAINT `Client_Child_Info_ibfk_1` FOREIGN KEY (`ChildID`) REFERENCES `Client_RTchild` (`ChildID`) ON DELETE CASCADE ON UPDATE CASCADE;

ALTER TABLE `Client_Child_Schoolinfo`
  ADD CONSTRAINT `Client_Child_Schoolinfo_ibfk_1` FOREIGN KEY (`SchoolID`) REFERENCES `Client_RTschool` (`SchoolID`) ON DELETE CASCADE ON UPDATE CASCADE;

ALTER TABLE `Client_child_teacher`
  ADD CONSTRAINT `Client_child_teacher_ibfk_1` FOREIGN KEY (`TeacherID`) REFERENCES `Client_RTteacher` (`TeacherID`) ON DELETE CASCADE ON UPDATE CASCADE;

ALTER TABLE `Client_RTschool`
  ADD CONSTRAINT `Client_RTschool_ibfk_1` FOREIGN KEY (`ChildID`) REFERENCES `Client_RTchild` (`ChildID`) ON DELETE CASCADE ON UPDATE CASCADE;

ALTER TABLE `Client_RTteacher`
  ADD CONSTRAINT `Client_RTteacher_ibfk_1` FOREIGN KEY (`SchoolID`) REFERENCES `Client_RTschool` (`SchoolID`) ON DELETE CASCADE ON UPDATE CASCADE;

【问题讨论】:

  • 我会尽可能地对其进行标准化。到目前为止,您所拥有的还远远不够。例如,学校名称不应该是子表的一部分。由于您是新人,我听说过关于《凡人数据库设计》这本书的好消息。
  • 规范化表格时我不会担心空间问题
  • 您能否用CREATE 语句发布您建议的架构,这样会更容易给您反馈。
  • 我建议将日期字段添加到所有表:CreatedOnUpdatedOnDeletedOn 到所有表。此外,如果您的系统中有用户,那么 CreatedByModifiedBy 可能是个好主意。
  • 另外,请考虑为courses 而不是将其放入您的teachers 表和一个单独的参考表以映射教师教授的课程。据推测,一位老师可以教授多门课程,而一门课程可以由不同的老师教授。

标签: mysql sql database forms normalize


【解决方案1】:

...一个旧的,cmets 正朝着一个方向前进。

让我们为陈述添加一些理由:

像结构化信息一样共享表格的基准是来自任何其他供应商的 MS Excel 或 Office 软件。不幸的是,这些客户端应用程序不适合由多个作者进行近乎同时的编辑,但足以将信息从一个作者分发给多个读者。因此,如果工作模式是第二种,那么将数据和数据概念传输到数据库系统是没有用的,因为 MS Excel 是字面上的常识,并且分发/培训工作量很低。

但是,如果需要多个作者几乎同时进行编辑,并且您可以负担服务器硬件和应用程序开发的费用,那么服务器上的数据库将是存储数据的最佳位置。

好的,鉴于已做出数据库决定: 进行规范化或非规范化是一个设计决策。维护、设置工作和硬件支持等因素对设计决策起着重要作用。软件功能设计取决于数据模型设计,并且软件功能设计必须支持您的情况是处理应用程序的业务逻辑。不幸的是,根据业务逻辑,非规范化通常建立在假设之上(在您也为规范化模型制定的那些基本假设之上),在未来的发展中经常会修改其丑陋的后果,即到那时软件功能也必须改变.如果软件没有时间限制的范围,那么非规范化会带来一些好处。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    • 2011-12-07
    • 2020-03-06
    • 2012-07-30
    相关资源
    最近更新 更多