假设我要代表三种类型的事物-祖父母,父母和孩子。祖父母与父母之间存在一对多的关系,父母与孩子之间存在一对多的关系。共享祖父母的父母必须具有唯一的名称。 孩子也一样,因为所有共享祖父母的孩子都必须有一个唯一的名字。
这是一个示例架构:
CREATE TABLE grandparent (
grandparentid TEXT PRIMARY KEY,
uniquefield1 TEXT NOT NULL
);
CREATE TABLE parent (
parentid TEXT PRIMARY KEY,
grandparentid TEXT REFERENCES grandparent,
name TEXT NOT NULL,
uniquefield2 TEXT NOT NULL,
UNIQUE (grandparentid, name)
);
CREATE TABLE child (
childid TEXT PRIMARY KEY,
grandparentid TEXT REFERENCES grandparent,
parentid TEXT REFERENCES parent,
name TEXT NOT NULL,
uniquefield3 TEXT NOT NULL,
UNIQUE (grandparentid, name)
);
我正在尝试提出一些解决方案,以消除对grandparentid
表中的child
字段的需要,因为我不想陷入一种与内容不同意的情况parentid
字段中。但是,就我所知,我不能仅仅删除它,因为我仍然需要对grandparentid
和name
进行约束。
还值得注意的是,每一代人都有独特的信息。这是一个人为的示例,因为实际用例是特定于域的,只会混淆问题。
答案 0 :(得分:1)
您需要避免不受数据库控制但由应用程序控制的冗余。应用程序中的单个错误可能会在数据中存储很难解决的差异。如果控制得当,冗余就可以了。
您需要在hadoopConf.set("fs.s3a.aws.credentials.provider", "com.amazonaws.auth.profile.ProfileCredentialsProvider")
表中包括grandparentid
列,以确保子集中name列的唯一性。现在,要考虑的关键方面是您需要child
表中的复合键,该键可以从parent
表中引用。这样,您将能够在child
表中强制唯一性,并确保冗余始终由数据库验证。
例如:
child
请注意最后一行:
create table grandparent (
grandparentid text primary key,
uniquefield1 text not null
);
create table parent (
parentid text not null,
grandparentid text not null references grandparent (grandparentid),
name text not null,
uniquefield2 text not null,
unique (parentid, grandparentid), -- added this key
unique (grandparentid, name)
);
create table child (
childid text primary key,
grandparentid text not null,
parentid text not null,
name text not null,
uniquefield3 text not null,
unique (grandparentid, name),
foreign key (parentid, grandparentid)
references parent (parentid, grandparentid)
);
此外键引用 foreign key (parentid, grandparentid)
references parent (parentid, grandparentid)
表中的唯一约束。
使用此结构,您将无法插入错误的parent
和grandparentid
组合。数据库只是没有它。