【问题标题】:MySQL alternative to PostgreSQL's custom data type (and domain)MySQL 替代 PostgreSQL 的自定义数据类型(和域)
【发布时间】:2021-04-19 08:50:37
【问题描述】:

在 PostgreSQL 中,如果我将特定数据类型(例如 mail address)存储在跨多个表的多个列中,我可以简单地定义具有所有约束的自定义邮件类型,如下所示:

CREATE TYPE status_enum AS enum ('accepted', 'declined', 'awaiting');
CREATE DOMAIN mail_address
    AS varchar(100) CHECK(value ~ '[A-Za-z0-9.]+@[A-Za-z0-9]+[.][A-Za-z]+');

然后像这样使用它:

CREATE TABLE user (
    ...
    personal_email    mail_address    NOT NULL UNIQUE,
    work_email        mail_address    NOT NULL UNIQUE,
    status            status_enum     NOT NULL,
    ...
);

CREATE TABLE job (
    ...
    status            status_enum     NOT NULL,
    client_email      mail_address    NOT NULL UNIQUE,
    ...
);

我发现 MySQL 不是对象关系数据库,因此没有自定义数据类型。

我的问题是:

人们如何在 MySQL 中处理多列中重复出现的数据类型,以防止复制粘贴相同的约束?

【问题讨论】:

  • 人们不会“防止复制粘贴相同的约束”。或者他们规范化结构并将所有电子邮件存储在一个表中。
  • 你不会找到类似的解决方案,你必须在 mysql 的约束下工作。如果多个表中的数据是同一类的实例,那么您可以创建一个表来保存该类的所有实例,并使用外键来引用特定实例。
  • 虽然标准化结构并将所有用户电子邮件仅放在users.email 中是个好主意,但有时我们需要将电子邮件存储在多个表中(如customer.emailemployee.email_personalemployee.email_corporate )。创建一个单独的emails 表然后创建引用emails 表的列users.email_idemployee.email_id_personalemployee.email_id_corporate 根本没有多大意义
  • 另外,经常使用 mysql 的应用程序(至少我正在这样做)验证服务器端/应用程序层中的数据,而不是捕获数据库错误/警告
  • @Kristian 我认为您的反应对于提供的示例来说太具体了。一般的问题是:如何在 mysql 中模拟自定义数据类型,而无需一次又一次地手动重复相同的约束。答案是:将数据存储在一个公用表中。如果该数据模型在特定情况下没有意义,那么不幸的是,OP 在 mysql 中无法做任何事情来避免重复字段的约束和其他属性。

标签: mysql sql constraints sql-types sql-domain


【解决方案1】:

首先,您可以使用参考表来实现:

create table statuses (
     status int primary key,
     status_name varchar(255)
);

然后将使用外键约束来处理关系。顺便说一句,这不是“神秘”,而是在大多数数据库中如何处理这种关系。

第二个将由用户定义的函数处理。大多数数据库在 check 约束中支持这一点。不幸的是,MySQL 要求您使用触发器进行数据验证——但它们都可以使用相同的底层函数。

或者,创建一个电子邮件表并仅验证该表中的电子邮件。所有其他电子邮件将使用email_id 而不是电子邮件本身。您可能会发现这具有前瞻性。我发现将此类 PII 存储在单独的表中也有助于保护隐私。

【讨论】:

  • 不幸的是,MySQL 要求您使用触发器进行数据验证——但它们都可以使用相同的底层函数。在 MySQL 8.0.16 之前,是的 -> 在 MySQL 8.0.16 之后检查终于起作用了,请参阅dev.mysql.com/doc/refman/8.0/en/…
  • 您能否提供一个简单的示例,用于验证 3 列的单个触发器(其中 2 个在同一个表中,一个在不同的表中)?另外,您能否详细说明在 MySQL 中存储在单独的表中如何有助于隐私? (虽然可能是题外话)_
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-13
  • 2013-08-16
  • 2022-01-06
  • 1970-01-01
  • 2011-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多