首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >建议MySql表设计

建议MySql表设计
EN

Stack Overflow用户
提问于 2018-12-16 08:42:06
回答 2查看 57关注 0票数 0

嘿,伙计们,我想知道是否有更好的方法来处理mysql表。我必须(在php应用程序中)根据9个属性评估任务是如何完成的,问题是,每年一次,列可能会改变一次(命名而不是评估字段的数量)。

代码语言:javascript
复制
CREATE TABLE IF NOT EXISTS `grades` (
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `score_id` int(10) NOT NULL,
  `task_number` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL,
  `assigned_to` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL,
  `location` varchar(3) COLLATE utf8mb4_unicode_ci NOT NULL,
  `completed_at` date NOT NULL,
  `priority` tinyint(1) NOT NULL DEFAULT '0',
  `worknotes` tinyint(1) NOT NULL DEFAULT '0',
  `client_com` tinyint(1) NOT NULL DEFAULT '0',
  `closure_info` tinyint(1) NOT NULL DEFAULT '0',
  `status` tinyint(1) NOT NULL DEFAULT '0',
  `category` tinyint(1) NOT NULL DEFAULT '0',
  `ci` tinyint(1) NOT NULL DEFAULT '0',
  `timecard` tinyint(1) NOT NULL DEFAULT '0',
  `resolution_time` tinyint(1) NOT NULL DEFAULT '0',
  `validated` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT
CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
COMMIT;

因此,我的第一个想法是创建另一个具有属性名称的表,并有两个这样的表

代码语言:javascript
复制
  CREATE TABLE IF NOT EXISTS `grades` (
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `score_id` int(10) NOT NULL,
  `task_number` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL,
  `assigned_to` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL,
  `location` varchar(3) COLLATE utf8mb4_unicode_ci NOT NULL,
  `completed_at` date NOT NULL,
  `grade1` tinyint(1) NOT NULL DEFAULT '0',
  `grade2` tinyint(1) NOT NULL DEFAULT '0',
  `grade3` tinyint(1) NOT NULL DEFAULT '0',
  `grade4` tinyint(1) NOT NULL DEFAULT '0',
  `grade5` tinyint(1) NOT NULL DEFAULT '0',
  `grade6` tinyint(1) NOT NULL DEFAULT '0',
  `grade7` tinyint(1) NOT NULL DEFAULT '0',
  `grade8` tinyint(1) NOT NULL DEFAULT '0',
  `grade9` tinyint(1) NOT NULL DEFAULT '0',
  `validated` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
COMMIT;

代码语言:javascript
复制
   CREATE TABLE IF NOT EXISTS `evaluation_fields` (
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` varchar(40) COLLATE utf8mb4_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
COMMIT;

INSERT INTO `evaluation_fields` (`id`, `name`) VALUES
(1, 'Priority'),
(2, 'Worknotes'),
(3, 'Client Com'),
(4, 'Closure information'),
(5, 'Status management'),
(6, 'Category management'),
(7, 'CI identification', ),
(8, 'Timecard management'),
(9, 'Resolution Time');
COMMIT;

你建议怎么做呢?为你的时间提前。希望我说得有道理

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-16 12:38:59

你不想每年都改变结构。您需要定义一个足够灵活的设计,以适应您的用例。

我建议你应该能够用三个表来处理这个问题:

属性包含所有可用于计算任务的属性。它基本上是一个引用表,它的内容只有在需要创建新的计算属性时才会被修改(大约每年一次)。比如:

代码语言:javascript
复制
id        - primary key
name  - name of the evaluation attribute 

等级用于存储评估结果。每个评估有一行,有几个字段包含评估的主数据,如下所示:

代码语言:javascript
复制
id     - primary key
score_id
task_number
assigned_to
location 
completed_at
priority 

计算用于存储每个评估的详细信息。它对每个计算使用的每个属性都有一行,并使用外键引用上述两个表,例如:

代码语言:javascript
复制
id                    - primary key 
grade_id         - foreign key to column id in table grades
evaluation_id  - foreign key to column id in table attributes
票数 0
EN

Stack Overflow用户

发布于 2018-12-16 09:20:15

我认为您需要3个表--一个用于任务及其属性,另一个用于包含此计算的名称和任何其他属性的计算字段,并且这个表与任务之间的关系将是多到多的--这意味着第三个表基本上应该具有任务的id和计算字段的id以及其他需要的属性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53800676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档