将多个行与另一个行关联的最佳数据库设计是什么?
假设我们有一张名为“生意”的桌子。
我将如何将业务A、业务B和业务C关联到可以从每个业务中检索相关模型的程度。
也就是说,如果用户正在查看业务C,则可以检索业务A和业务B。如果用户正在查看业务B,则可以检索业务A和业务C。如果用户正在查看业务A,则可以检索业务B和业务C。
我一直在考虑多到多的关系,但我必须创建3条记录来存储这种关系,例如:
Business_1 | Business_2
--------------------------
Business A | Business B
Business A | Business C
Business B | Business C这是最好的方法吗?
发布于 2018-05-07 21:07:11
我能想到的最好的方法是做生意和父母之间的业务关系。
基本上,一张桌子将存储所有的企业。让我们说:
CREATE TABLE BUSINESS(
BUSINESS_ID nvarchar(50) NOT NULL PRIMARY KEY
);然后是第二个表,它引用它来存储任何相关的父母。我特别提到父母,因为如果你沿着建立普通关系的道路走下去,你最终可能会得到循环的推荐信。A与B有关,而B与A等有关。
无论如何,除了向Business表添加一个引用之外,第二个表将与第一个表几乎相同。
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的一个示例记录集应该是
[BUSINESS]
BUSINESS_ID
-----------------
'BUSINESS A'
[RELATED_BUSINESS]
BUSINESS_ID | RELATED_BUSINESS_ID
------------|-------------------
'BUSINESS A'| 'BUSINESS B'
'BUSINESS A'| 'BUSINESS C'发布于 2018-05-09 02:53:44
链接的业务是相互排斥的组还是一个扩展的网络?
如果{A,B,C}构成一个封闭群,用户可以从其中任何一个到另一个,但不能得到X、Y或Z,那么你就有一个封闭的组。但是,如果用户可以从A、B或C中的任何一个导航到,比方说,X,然后到达Y或Z,则有一个扩展的网络。
对于封闭组场景,向业务表添加一个Group_Identifier就足够了。然后数据变成
Business_Name | Group_Identifier
---------------------------------
Business A | One
Business B | One
Business C | One
Business X | Two
Business Y | Two
Business Z | Two检索相关实体
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“在两组中都有。数据如下:
Business_Name | Group_Identifier
---------------------------------
Business A | One
Business B | One
Business C | One
Business C | Two
Business D | Two
Business E | Two要查找链接的业务,请阅读当前业务的组,然后阅读那些组中的其他业务。我不熟悉MySQL语法,但它将类似于
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上的索引读取此表将是有效的。如果企业经常改变分组,那么尝试维护一组最小的分组可能是很棘手的。
https://dba.stackexchange.com/questions/206080
复制相似问题