首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将多个记录相互关联的最佳方法

将多个记录相互关联的最佳方法
EN

Database Administration用户
提问于 2018-05-07 18:54:36
回答 2查看 464关注 0票数 1

将多个行与另一个行关联的最佳数据库设计是什么?

假设我们有一张名为“生意”的桌子。

我将如何将业务A、业务B和业务C关联到可以从每个业务中检索相关模型的程度。

也就是说,如果用户正在查看业务C,则可以检索业务A和业务B。如果用户正在查看业务B,则可以检索业务A和业务C。如果用户正在查看业务A,则可以检索业务B和业务C。

我一直在考虑多到多的关系,但我必须创建3条记录来存储这种关系,例如:

代码语言:javascript
复制
Business_1  | Business_2
--------------------------
Business A  | Business B
Business A  | Business C
Business B  | Business C

这是最好的方法吗?

EN

回答 2

Database Administration用户

回答已采纳

发布于 2018-05-07 21:07:11

我能想到的最好的方法是做生意和父母之间的业务关系。

基本上,一张桌子将存储所有的企业。让我们说:

代码语言:javascript
复制
CREATE TABLE BUSINESS(
BUSINESS_ID nvarchar(50) NOT NULL PRIMARY KEY
);

然后是第二个表,它引用它来存储任何相关的父母。我特别提到父母,因为如果你沿着建立普通关系的道路走下去,你最终可能会得到循环的推荐信。A与B有关,而B与A等有关。

无论如何,除了向Business表添加一个引用之外,第二个表将与第一个表几乎相同。

代码语言:javascript
复制
CREATE TABLE RELATED_BUSINESS(
BUSINESS_ID nvarchar(50) NOT NULL,
RELATED_BUSINESS_ID nvarchar(50) NOT NULL,
CONSTRAINT PK_RELATED_BUSINESS PRIMARY KEY  
(
    BUSINESS_ID ASC,
    RELATED_BUSINESS_ID ASC
),
FOREIGN KEY (BUSINESS_ID)
            REFERENCES BUSINESS (BUSINESS_ID),
FOREIGN KEY (RELATED_BUSINESS_ID)
            REFERENCES BUSINESS (BUSINESS_ID)
)

因此,业务A的一个示例记录集应该是

代码语言:javascript
复制
[BUSINESS]
BUSINESS_ID
-----------------
'BUSINESS A'

[RELATED_BUSINESS]
BUSINESS_ID | RELATED_BUSINESS_ID
------------|-------------------
'BUSINESS A'| 'BUSINESS B'
'BUSINESS A'| 'BUSINESS C'
票数 0
EN

Database Administration用户

发布于 2018-05-09 02:53:44

链接的业务是相互排斥的组还是一个扩展的网络?

如果{A,B,C}构成一个封闭群,用户可以从其中任何一个到另一个,但不能得到X、Y或Z,那么你就有一个封闭的组。但是,如果用户可以从A、B或C中的任何一个导航到,比方说,X,然后到达Y或Z,则有一个扩展的网络。

对于封闭组场景,向业务表添加一个Group_Identifier就足够了。然后数据变成

代码语言:javascript
复制
Business_Name  | Group_Identifier
---------------------------------
Business A     | One
Business B     | One
Business C     | One
Business X     | Two
Business Y     | Two
Business Z     | Two

检索相关实体

代码语言:javascript
复制
select
  businesses_name
from businesses
where group_identifier = <the current row's identifier>
and businesses_name != <the current row's name>

如果单个企业可以参与多个组,那么您就有了一个所谓的图表。您自己和射手的解决方案实现了这个场景。然而,这些模型是一个有向图--每个组合都有一个"from“和" to”结束。要查找所有可能的链接,您必须读取该表两次--一次使用Business_1列,一次使用Businesses_2列--或者将每行加倍-- "A到B“和"B到A”。(有一些专门的图形数据库产品可以处理这个问题,但这超出了这个问题的范围。)

另一种实现是有一个新的Business_Links表。它有两列Business_Name和Group_Identifier。请注意,这与上面的示例数据不一样。这是业务表的扩展。每家公司有一排。这是一张新桌子。每家企业可能有很多行。

假设{A,B,C}形成一个群,{C,D,E}也是这样。"C“在两组中都有。数据如下:

代码语言:javascript
复制
Business_Name  | Group_Identifier
---------------------------------
Business A     | One
Business B     | One
Business C     | One
Business C     | Two
Business D     | Two
Business E     | Two

要查找链接的业务,请阅读当前业务的组,然后阅读那些组中的其他业务。我不熟悉MySQL语法,但它将类似于

代码语言:javascript
复制
select
  business_name
from business_links
where group_identifier in (
  select
    group_identifier
  from business_links
  where business_name = <current name>
)
and business_name != <current name>

使用business_name上的索引和group_identifier上的索引读取此表将是有效的。如果企业经常改变分组,那么尝试维护一组最小的分组可能是很棘手的。

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/206080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档