mysql - 有问题的归一化

标签 mysql sql database forms normalize

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

所以为了简短起见,我拥有的信息是 AppId、姓氏、名字、性别、年龄、DoB、关系、学校名称、学校地址、学校电话号码、教师、议员,如果他们在育儿 (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

所以任何输入将不胜感激

编辑:这是基本结构,稍后还会添加修改属性,暂时删除类(class)。谢谢

   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;

最佳答案

...一个旧的,评论都朝着一个方向发展。

让我们为声明添加一些基本原理:

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

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

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

关于mysql - 有问题的归一化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14800421/

相关文章:

c# - 在数据库应用程序中处理 SqlExceptions 的推荐方法

sql - 如何对一个表执行批量 SQL 插入,其中包含来自两个单独表的行

c# - OleDbDataReader 如何读取数字类型?

database - 我的 Oracle 10gr2 检查约束有什么问题?试图强制执行日期范围

mysql - WordPress 复制器从子域移动到根/域

mysql - 如何删除名称中包含字符 '?' 的数据库?

java - java中的多线程持久队列

mysql - mysql 表中的数据非常大。即使是 select 语句也需要很多时间

MySQL在子查询中引用外部选择

mysql - 如果记录存在,则返回匹配数组中的所有记录 MySQL 查询