【问题标题】:MySQL: designing flexible database fieldsMySQL:设计灵活的数据库字段
【发布时间】:2021-09-24 11:25:58
【问题描述】:

我正在设计一个数据库来托管灵活、不断发展的模型。例如,我可能有一个包含名称、组和密码的用户表;我可能想随时添加其他字段,例如电话号码。以下屏幕截图显示了一个示例。

上表描述了模型结构,但我的数据库中也有用户对象。这种数据库通常是如何设计的?

【问题讨论】:

  • 关系数据库不适合您共享的用例。 NoSQL 数据库在这里更合适。或者,如果关系结构是硬性要求,您可以使用 JSON 来存储额外的字段,但它会在性能和易用性方面进行权衡。

标签: mysql database django-models


【解决方案1】:

在关系数据库中,当您想要添加新列时,您可以使用ALTER TABLE...ADD COLUMN...。在一张桌子的整个生命周期中,您可以多次这样做。在我的公司,我们已经进行了 75,000 多次这样的改动,而且每周还会进行数百次。

在 MySQL 8.0 中,它们现在支持“即时添加列”,因此不需要很长时间。详情请见https://mysqlserverteam.com/mysql-8-0-innodb-now-supports-instant-add-column/

对于某些属性,创建另一个表可能会更好。例如,在您添加电话号码的示例中,给定用户通常拥有多个电话号码。这是用户的多值属性,因此为了数据库规范化,您应该创建另一个表,其中每行存储一个电话号码,并引用拥有该电话号码的用户。添加引用用户表的新表不会锁定或更改用户表。

有些人想要添加属性而不使用ALTER TABLE。在关系数据库中,您必须使用“半结构化”数据类型,如 JSON 或 XML。但是 SQL 语义并不真正了解此类文档中的虚拟字段和结构,因此不要期望它与真实列一样工作。请参阅我的演示文稿How to Use JSON in MySQL Wrong

NoSQL 数据库为数据的“流动”结构提供了不同的解决方案。像 MongoDB 这样的文档数据库将相关数据的对象存储为基本上是 JSON 的“文档”。像 ScyllaDB 这样的键/值数据库存储一条记录,其主要访问方法类似于主键,并且该记录中的有效负载可以具有固定或可变字段。

总会有取舍。通过使数据库更加灵活,数据存储必须牺牲效率或完整性。更灵活的数据模型也使客户端应用程序更复杂,因为您无法确定任何数据记录都会有一组可预测的字段。所以你必须编写大量的应用程序代码来适应不同字段的记录。

【讨论】:

    【解决方案2】:

    您可以对这些“可选”字段使用 JSON 数据类型。

    https://dev.mysql.com/doc/refman/8.0/en/json.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-22
      • 2013-03-28
      • 1970-01-01
      • 2017-08-09
      • 1970-01-01
      • 2016-01-12
      • 2014-10-10
      相关资源
      最近更新 更多