常量表设计 MySQL 最佳实践
Posted
技术标签:
【中文标题】常量表设计 MySQL 最佳实践【英文标题】:Constants Table Design MySQL Best Practice 【发布时间】:2017-11-30 09:27:44 【问题描述】:我需要存储一组“权重”常量,它们会定期更改,在某些计算中使用。以下哪项是更好的桌子设计,或者都不是!
这是我需要存储的:
Month Weight (%)
Jan 5
Feb 5
Mar 10
Apr 10
May 10
Jun 10
Jul 10
Aug 10
Sep 10
Oct 10
Nov 5
Dec 5
1 行 12 列的表格:
CREATE TABLE IF NOT EXISTS `constant_month` (
`month_01` DECIMAL(5,2) NOT NULL,
`month_02` DECIMAL(5,2) NOT NULL,
`month_03` DECIMAL(5,2) NOT NULL,
`month_04` DECIMAL(5,2) NOT NULL,
`month_05` DECIMAL(5,2) NOT NULL,
`month_06` DECIMAL(5,2) NOT NULL,
`month_07` DECIMAL(5,2) NOT NULL,
`month_08` DECIMAL(5,2) NOT NULL,
`month_09` DECIMAL(5,2) NOT NULL,
`month_10` DECIMAL(5,2) NOT NULL,
`month_11` DECIMAL(5,2) NOT NULL,
`month_12` DECIMAL(5,2) NOT NULL)
ENGINE = InnoDB
12行6列的表格:
CREATE TABLE `constant_month` (
`constant_month_id` int(11) NOT NULL,
`create_date` datetime NOT NULL,
`modified_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`number` int(11) NOT NULL,
`name` varchar(25) NOT NULL,
`weight` decimal(5,2) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
第二个选项允许提供更多信息,但不一定是必需的。
扩展这个问题如果我需要存储的常量是不同的数据类型会发生什么?在这种情况下,它们都是百分比,但我有另一个需要混合数据类型的常量表。选项 1 是否更好,我可以专门为每个常量(INT、DECIMAL 和 FLOAT 的混合)设置数据类型,或者将选项 2 与通用 TEXT 数据类型一起使用?
谢谢
【问题讨论】:
好吧,在这个特定的例子中,您可能会倾向于采用“12 列”方法,因为我们目前一年中有 12 个月的系统不太可能很快改变。但总的来说,你应该把它标准化——这也是我在这里推荐的。 (主要是出于原则,因为在下一个可比较的情况下这样做不同恰好没有固定数量的此类值,这将是一个相当糟糕的“混合”。恕我直言。) 如果您需要存储不同类型的任意值,那么您可以为每种可能的类型使用一列 - 但我可能会添加一个额外的包含有关类型信息的列,以便您会知道要查看哪些其他列。但是您仍然需要使用控制流函数的某种条件逻辑,以从正确的类型列中获取数据。 [...] [...] 在这种情况下,使用“通用”文本类型可能更有意义,它还可以以正确的格式保存数字、日期等内容。 (由于这仅用于存储常量,我不认为您需要对这些记录执行任何类型的“高级”操作,这需要“正确的”列类型才能工作。 ) 嗨 CBroe。感谢您的洞察力。我发布这个问题是因为我对 12 列方法感到不舒服,而且您已经确定这不是一个“好”的方法。对于“一般”文本类型,您建议使用什么数据类型;你认为 VARCHAR(25) 就足够了吗?谢谢 使用 VARCHAR,您通常可以更加“慷慨”——它只会使用与您实际放入字符一样多的存储空间,请参阅dev.mysql.com/doc/refman/5.7/en/… 因此,如果您将 10 个字符存储到 VARCHAR( 255) 列,仍然只占用 10+1 字节的实际存储空间。但是你会有“保留”来处理内置的更长的值。 【参考方案1】: “通用 TEXT 数据类型”——不好,尤其是当您需要比较数值时。 跨列展开数组——不好。 (1 行 12 列方法)。 在 12x6 方法中是否需要全部 6 列?【讨论】:
以上是关于常量表设计 MySQL 最佳实践的主要内容,如果未能解决你的问题,请参考以下文章