2011-03-18 143 views
1

我最近在空余时间开始做自由PHP + MySQL开发,以补充我从C#/ SQL Server代码编写的全职工作中获得的收入。我注意到的一个与数据库相关的重大差异之一是MySQL有一个枚举数据类型,而SQL Server则没有。这是MySQL枚举数据类型的适当使用吗?

当我注意到enum数据类型时,我立即决定压扁我的数据模型,以支持使用枚举的大表,而不是使用许多较小的表来表示离散实体和一个大的“桥”类表。

我目前正在使用的网站是用于唱片公司的。我只有一张表来存储标签的发行版,即“发行版”表。我通常在任何地方都使用枚举,我通常会将外键用于单独的表格 - 艺术家名称,标签名称和其他几个。用户可以通过后端编辑这些枚举列。我所看到的使用文本字段进行枚举的主要优点是艺术家名称将被重用,这将改善数据完整性。我也看到了在数据库中拥有较少表的优势。顺便说一下,我还有一个额外的表格和一个桥接表格 - 有一个“标签”功能可以为特定版本添加标签,并且由于这是一种多对多的关系,所以我觉得离散标签表和表桥加入标签的版本是合适的

有从未遇到之前数据库中的数据类型ENUM,我不知道如果我作出明智地使用这项功能,或者是否有问题我没有预见作为这种数据架构的结果,可能会回来咬我。有经验的MySQL'ers,你觉得怎么样?

+3

你可以发表一些代码,所以我可以在http://thedailywtf.com上提交吗? – 2011-03-18 02:39:38

+2

恐怕我不符合thedailywtf的资格,因为这是我的第一个php/mysql网络应用程序,并且dailywtf试图让初学者很好。我会承认,我很荣幸能够在该网站上! – SuperNES 2011-03-18 13:24:17

+0

但你是一个经验丰富的C#/ SQL服务器编码器 - 跆拳道! – 2011-03-18 14:49:48

回答

3

我会说实话 - 我停下来,当我读到...

我用枚举我到处 通常会使用一个外键到 单独的表 - 艺术家的名字,标签 名称和其他几个。

如果我理解正确,那就意味着有一个所有艺术家的枚举。但是,艺术家的列举肯定会成为一个变化点:将会有更多的艺术家。我真诚怀疑唱片公司从来没有计划增加或改变艺术家名单;)

因此,在我看来,这是一个不正确的使用枚举。

我也不认为适合执行ALTER TABLE是不可避免的一个相当平凡的用例。 (创建/阅读/更新/销毁艺术家)我没有数字来支持这一观点。

你必须把它看作一个什么样的信息是一个实体或一个实体属性的问题:对于一个唱片公司,艺术家是实体,但媒体类型可能不是。艺术家有很多与他们有关的信息(姓名,流派,奖项,网站网址,资历等),这表明他们是一个实体,而不是诸如发布等其他实体的属性。此外,艺术家创建/阅读/更新和销毁作为他的系统日常使用的一部分,进一步表明他们是实体。

实体倾向于获得他们自己的表。现在,当您查看这些版本的媒体类型时,您不得不问自己媒体类型是否有其他信息......如果它不是名称,您有新的实体。例如,如果您的系统必须跟踪媒体类型是否过时,现在媒体类型(名称,已过时)有两个属性,它应该是一个单独的实体。如果Medai类型只在您构建的范围内有一个名称,那么它是另一个实体的属性,并且应该只是一个列而不是一个表。那时我会考虑使用枚举。

+0

好的,所以我看到使用单独表格来存储艺术家和标签的争论。但是,我还使用枚举来存储媒体类型(10“/ LP,Cassette,7”,Zine,Misc)和发布类型(新建,使用,即将到来,已过)。这些看起来更像静态的,不变的价值观。这可能更好地使用枚举? – SuperNES 2011-03-18 13:26:05

+0

@SuperNES - 编辑我的回答以解决您的评论。 – 2011-03-18 13:40:16

+0

@SuperNES它真的取决于你期望有多少新的“类型”,以及你需要多长时间从其他表中引用此类型。如果答案是“几乎从不”或“永不”,那么它看起来很好。否则,我认为这将是一个坏主意。但是,尽管如此 - 为什么不愿意使用FK?我没有看到你在这里保存的东西 - 这似乎是使用关系数据库的一种非理性的恐惧,因为它是有意使用的。 – 2011-03-18 13:40:51

6

总之,这不是一个好设计。外键有目的。

the documentation for the ENUM type

枚举可以具有最大65535个元件。

您的设计不允许您存储超过65k个不同的艺术家姓名。

您是否考虑过添加新艺术家名称会发生​​什么?我假设你正在运行一个ALTER TABLE来添加新的枚举类型?根据a similar SO question this is a very expensive operation。将其与简单地将另一行添加到artist表的成本相对比。

如果您有多个表需要引用艺术家/艺术家的名字,会发生什么情况?你如何在表中重用枚举值?

此方法还有许多其他问题。我认为简化你的数据库设计就像这样,你真的会伤害(外键或者有多个表并不是坏事!)。

+0

+1 - 只是揍我一拳! – 2011-03-18 01:44:45

2

我不认为你可以在像艺术家这样的领域中使用枚举。它就像你正在限制你的应用程序不断增长。这将是很难保持专栏。使用ENUM不是它自己的问题。但在以下情况下会出现问题

  1. 当您需要将其他选项添加到枚举列。如果您的表格包含大量数据,那么在添加附加选项时需要花费很长时间重新生成表格
  2. 当您需要将数据库移植到另一种技术时(枚举在所有数据库产品中都不可用,例如MSSQL )