gpt4 book ai didi

database-design - 数据库规范化。超越无限?

转载 作者:行者123 更新时间:2023-12-02 21:05:53 25 4
gpt4 key购买 nike

您到底对下面的示例进行了多大程度的规范化,以及该示例到底达到了哪个规范化级别?

CREATE TABLE "public"."contact_info" (
"id" SERIAL,
"home_phone" TEXT,
"mobile_phone" TEXT,
"work_phone" TEXT,
"fax_phone" TEXT,
"email" TEXT,
"line1" TEXT,
"line2" TEXT,
"city" TEXT,
"state_id" INTEGER,
"zipcode" TEXT,
"preferred_type" TEXT,
"first_name" TEXT,
"last_name" TEXT,
CONSTRAINT "contact_info_pkey" PRIMARY KEY("id"),
CONSTRAINT "contact_info_fk_state_id" FOREIGN KEY ("state_id")
REFERENCES "public"."states"("id")
ON DELETE NO ACTION
ON UPDATE NO ACTION
NOT DEFERRABLE
) WITH OIDS;

需要注意的是,每条记录只能有 0 或 1 个家庭号码、移动号码、工作号码或传真号码记录。每个电话号码的功能完全取决于我的主 key 。根据我对数据库规范化的了解,我认为这满足 5NF,但不符合 6NF。

由于电话号码定义是一成不变的(没有新的电话号码类型,没有多个 home_phone 条目等),是否有任何原因我想将电话号码拆分为由(contact_info_id,phone_number)跟踪的单独关系,输入)?

最佳答案

由于您已将此系统定义为每种类型仅包含 0 或 1 个电话号码,因此您的系统比更精确的系统满足更高级别的规范化要求。

就我个人而言,我会将电话号码存储在一个单独的表中,其中包含 ID、公共(public) ID、类型、区号、交换机、后缀和分机号。如果您需要使用这些值中的某个值来选择所有内容,那么在 SQL 中以编程方式执行会更加痛苦。

以同样的方式,您选择将人名分为开头和结尾部分(但忽略前缀、中间名和后缀)。如果您可以将一列分成逻辑部分,那么有人可能会说您没有通过 BCNF。

您必须做出的关于表规范化程度的选择主要取决于您选择访问数据的方式。对于大多数人来说,将电话号码等列分成多个部分有点过分,但如果我的上述任何一点对您的需求有用,那么请考虑它。

PS。 line1 和 line2 是什么?

关于database-design - 数据库规范化。超越无限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1863372/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com