我最近在空闲时间开始自由开发PHP + MySQL开发,以补充我从写C#/ SQL Server代码的全职工作中获得的收入。我注意到的一个与数据库相关的重大差异是MySQL有一个枚举数据类型,而SQL Server没有。
当我注意到enum数据类型时,我立即决定展平我的数据模型,转而使用一个使用枚举的大表而不是许多用于离散实体的小表和一个大的“桥”类表。
我目前正在处理的网站是一个唱片公司。我只有一个表来存储标签的版本,即“版本”表。我在任何地方都使用了枚举,我通常会将一个外键用于一个单独的表 - 艺术家名称,标签名称和其他几个。用户可以通过后端编辑这些枚举列。我在枚举时看到的主要优点是使用文本字段可以重用艺术家名称,这样可以提高数据的完整性。我还看到在数据库中拥有更少表的优势。
顺便提一下,我还有一个额外的表和一个桥接表 - 有一个“标签”功能可以为特定版本添加标签,因为这是一个多对多的关系,我觉得一个离散的标签用于将标记连接到发布的表和桥表是合适的
以前从未在数据库中遇到过ENUM数据类型,我想知道我是否明智地使用了这个功能,或者是否有问题我没有预见到可能因为这个数据架构而再次咬我。经验丰富的MySQL',你怎么看?
答案 0 :(得分:6)
简而言之,这不是一个好的设计。外键有目的。
来自the documentation for the ENUM type:
枚举最多可包含65,535个元素。
您的设计不允许存储超过65,000种不同的艺术家名称。
您是否考虑过添加新艺术家姓名后会发生什么?我假设您正在运行ALTER TABLE
来添加新的枚举类型?根据{{3}}。将此与仅在artist
表中添加另一行的成本进行对比。
如果您有多个表需要引用艺术家/艺术家的名字,会发生什么?如何在表中重用枚举值?
这种方法还有许多其他问题。我认为像这样简化你的数据库设计会让你真正受到伤害(外键或有多个表并不是坏事!)。
答案 1 :(得分:3)
我会说实话 - 我读完时就停了......
我到处都使用了枚举 通常会使用外键来a 单独的表 - 艺术家姓名,标签 名字和其他几个。
如果我理解正确,那就意味着所有艺术家都有一个列举。但是,这些艺术家的列举肯定会成为一个变化点:将有更多的艺术家。我真诚地怀疑唱片公司从未计划增加或改变艺术家名单;)
因此,在我看来,这是对枚举的错误使用。
我也不认为对于不可避免的一个相当平凡的用例执行ALTER TABLE
是不合适的。 (创建/阅读/更新/销毁艺术家)我没有数字来支持这种观点。
您必须将其视为实体或实体属性的信息:对于记录标签,艺术家是实体,但媒体类型可能不是。艺术家有很多与他们相关的信息(名称,类型,奖项,网站网址,资历......),这表明他们是一个实体,而不是像Release这样的另一个实体的属性。此外,作为日常系统使用的一部分,艺术家被创建/阅读/更新和销毁,进一步暗示他们是实体。
实体往往会得到自己的表格。现在,当您查看这些版本的媒体类型时,您必须问自己媒体类型是否有任何其他信息......如果它只是名称,您有一个新的实体。例如,如果您的系统必须跟踪媒体类型是否已过时,那么现在媒体类型有2个属性(名称已过时),它应该是一个单独的实体。如果Medai类型只在您正在构建的范围内具有名称,那么它是另一个实体的属性,并且应该只是一个列,而不是一个表。那时我会考虑使用枚举。
答案 2 :(得分:2)
我认为你不能在艺术家这样的领域使用枚举。它就像你限制你的应用程序的增长。维护专栏真的很难。使用ENUM本身并不是问题。但在以下情况下会出现问题