首页 / JAVA / java-在两个多对多表之间进行联接
java-在两个多对多表之间进行联接
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-在两个多对多表之间进行联接,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4475字,纯文字阅读大概需要7分钟。
内容图文
![java-在两个多对多表之间进行联接](/upload/InfoBanner/zyjiaocheng/661/16a63d556db04f9a90d6942ce18af598.jpg)
我在为基于Java的Web应用程序定义适当的数据库设计时遇到麻烦.我有3个表(Tag,DT和Property),我的情况如下.每个标签可以包含许多Dts,并且每个DT可以分配给不同的标签,每个DT具有许多属性,并且每个属性可以在许多DT中使用.将DT分配给标签后,用户可以为其所有属性设置值.
我的问题是,如何定义一个关系,以便每个Tag都可以基于分配给它的DT来拥有其属性的值.我的设计中缺少哪些表格和关系.然后,我必须基于此数据库创建相对实体.
Tag1==> DT1 ==> Initial values1, property values set 1 ;
Tag2==> DT1 ==> Initial values1, property values set 2 ;
这是数据库图.并感谢您的事先帮助.
这是一些样本数据
解决方法:
如我所见,您设计的中心问题是代理键的使用.
不必总是为表创建数字单列键.
即使您这样做,也不能保证您不会重复.
实际上,这迫使系统在表上保留更多索引,即
要做的额外工作.
>一些概念:
>我在表名中使用单数,因为表中的每个元组都代表
关系的一个对象;
>我在表和列名称(标识符)中使用小写字母,
关键字的大字母.我不喜欢数据库中的CamelCase;
>我将< table_name> _id用于PK列.由于单数也有可能
表名;
>我将前缀表名称详细信息用于我创建的所有约束和索引.
您不必遵循它们,但是坚持一致的命名将非常好
您设计的图案.
>我将从property_type字典开始:
CREATE TABLE property_type (
property_type varchar(20) NOT NULL,
CONSTRAINT p_property_type PRIMARY KEY (property_type)
);
它是一个单列表,仅用于提供可能的域
属性类型的值.我用的是varchar(20),文本列很漂亮
精细.这样做的好处-您不必通过数字重新加入该表
键以获取property_type_id = 123的含义.
>属性:
CREATE TABLE property (
property_id integer NOT NULL,
property_name varchar(50) NOT NULL,
property_type varchar(20) NOT NULL,
CONSTRAINT p_property PRIMARY KEY (property_id),
CONSTRAINT u_property_name UNIQUE (property_name),
CONSTRAINT f_property_type FOREIGN KEY (property_type)
REFERENCES property_type ON UPDATE CASCADE
);
我决定在此处使用数字PK,因为我想您可能想重命名属性
在某一点.并且如果您更改property_type,更新将被级联.
尽管这里已经有一个PK,但在这里必须对名称进行唯一约束,
否则,您可能会面临出现同名属性的情况
具有不同的ID.
> DT表:
CREATE TABLE dt (
dt_id integer NOT NULL,
dt_name varchar(50) NOT NULL,
CONSTRAINT p_dt PRIMARY KEY (dt_id),
CONSTRAINT u_dt_name UNIQUE (dt_name)
);
同样,仅拥有PK是不够的,还创建了UNIQUE约束.
虽然我会完全摆脱dt_id并只会保留
dt_name,并且将其设为PK.
> DT的属性:
CREATE TABLE dt_property (
dt_id integer NOT NULL,
property_id integer NOT NULL,
initial_value varchar(50) NOT NULL,
CONSTRAINT p_dt_property PRIMARY KEY (dt_id, property_id),
CONSTRAINT f_dt_id FOREIGN KEY (dt_id) REFERENCES dt,
CONSTRAINT f_property_id FOREIGN KEY (property_id) REFERENCES property
);
这是与您的设计的第一个大区别–使用了复合键.
是的,这意味着您每次需要进行2列
请参阅此表中的条目.但这确实没什么大不了的-您
设计表一次,您也编写一次查询,但是软件
如果操作正确且易于维护,则可能会使用一段时间.
最好花更多时间编写查询并易于维护
从长远来看.
>标签:
CREATE TABLE tag (
tag_id integer NOT NULL,
tag_name varchar(50) NOT NULL,
CONSTRAINT p_tag PRIMARY KEY (tag_id),
CONSTRAINT u_tag_name UNIQUE (tag_name)
);
这只是另一本字典.再次,就像对于DT表,我真的很想
为了避免使用tag_id列并仅保留tag_name,使其也成为PK.
>引入了新表tag_dt:
CREATE TABLE tag_dt (
tag_id integer NOT NULL,
dt_id integer NOT NULL,
CONSTRAINT p_tag_dt PRIMARY KEY (tag_id, dt_id),
CONSTRAINT f_tag_id FOREIGN KEY (tag_id) REFERENCES tag,
CONSTRAINT f_dt_id FOREIGN KEY (dt_id) REFERENCES dt
);
该表是创建dt标签关系所必需的.没有它,您就有数据
重复项-您可以在架构上看到它,您有2行,其中Tag_name =’Tag1′.
>最后,标记属性:
CREATE TABLE tag_property (
tag_id integer NOT NULL,
dt_id integer NOT NULL,
property_id integer NOT NULL,
a_value varchar(50) NOT NULL,
CONSTRAINT p_tag_property PRIMARY KEY (tag_id, dt_id),
CONSTRAINT u_tag_property UNIQUE (tag_id, property_id),
CONSTRAINT f_tag_property_tag FOREIGN KEY (tag_id, dt_id) REFERENCES tag_dt,
CONSTRAINT f_tag_property_property FOREIGN KEY (dt_id, property_id)
REFERENCES dt_property
);
该表是完整的组合键,符合您的所有要求.
主键是tag_id,dt_id,它也是tag_dt表的外键,
因此您希望能够引入以前未定义的内容.
接下来,tag_id,property_id是唯一的,这意味着标记的属性不能重复.
最后,dt_id,property_id引用了dt_property表,这意味着
将仅注册该dt允许的属性.
最后的笔记
所有主键和唯一键都是通过大多数DBMS中的索引实现的.此外,某些DBMS
即使省略了键的第一列,也可以使用复合索引(多列索引).
至少PostgreSQL可以做到,这是我最常使用的.
请检查您的dt和tag表,我强烈建议您删除代理
像完成property_type一样键入这些内容.
我没有创建任何额外的索引,通常在实现数据模型并对其执行一些实际查询之后,我将进行此练习.
另外,请勿将value或name用作列名.这些是保留字,在您选择的DBMS的未来版本中,您可能会产生意想不到的影响.
内容总结
以上是互联网集市为您收集整理的java-在两个多对多表之间进行联接全部内容,希望文章能够帮你解决java-在两个多对多表之间进行联接所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。