【发布时间】: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.email、employee.email_personal和employee.email_corporate)。创建一个单独的emails表然后创建引用emails表的列users.email_id、employee.email_id_personal、employee.email_id_corporate根本没有多大意义 -
另外,经常使用 mysql 的应用程序(至少我正在这样做)验证服务器端/应用程序层中的数据,而不是捕获数据库错误/警告
-
@Kristian 我认为您的反应对于提供的示例来说太具体了。一般的问题是:如何在 mysql 中模拟自定义数据类型,而无需一次又一次地手动重复相同的约束。答案是:将数据存储在一个公用表中。如果该数据模型在特定情况下没有意义,那么不幸的是,OP 在 mysql 中无法做任何事情来避免重复字段的约束和其他属性。
标签: mysql sql constraints sql-types sql-domain