咨询MySql表设计

时间:2018-12-16 08:42:06

标签: mysql sql

大家好,我想知道是否有更好的方法来处理一些mysql表。 我必须根据9个属性评估(在php应用中)任务的完成方式问题是每年一次列可能会更改(命名不是评估字段的数目)

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;

所以我首先想到的是用属性名称创建另一个表,并有2个这样的表

  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;

   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;

您会如何建议?在您的时间提前。希望我有道理

2 个答案:

答案 0 :(得分:0)

我认为您需要3个表,一个用于任务及其属性,另一个用于包含该评估的名称和任何其他属性的评估字段,并且该表与任务之间的关系将会很多第三张表基本上应该具有任务的ID,评估字段的ID和您需要的其他属性

答案 1 :(得分:0)

您不想每年左右更改结构。您需要定义一个足够灵活以适合您的用例的设计。

我建议您应该可以使用3个表来管理它:

属性包含可用于评估任务的所有属性。它基本上是一个参照表,仅当需要创建新的评估属性时(大约每年一次),才修改其内容。喜欢:

id        - primary key
name  - name of the evaluation attribute 

等级用于存储评估结果。每种评估都有一行,其中一些字段包含评估的主数据,例如:

id     - primary key
score_id
task_number
assigned_to
location 
completed_at
priority 

评估用于存储每个评估的详细信息。对于用于每次评估的每个属性,它只有一行,并且使用外键(例如:

)引用了上述两个表
id                    - primary key 
grade_id         - foreign key to column id in table grades
evaluation_id  - foreign key to column id in table attributes