首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据库结构:这种结构可以与m:m一起使用吗?

数据库结构:这种结构可以与m:m一起使用吗?
EN

Stack Overflow用户
提问于 2011-03-19 03:03:48
回答 3查看 95关注 0票数 1

这是我的问题:(使用MySQL)

我有两个实体叫做“店铺”和“客户”。我在“客户”和“商店”之间有一个名为“clients_shops”(CakePHP命名约定)的M:M表。我这样做的原因是,这是一个SaaS应用程序,其中“客户端”可能有许多“商店”,“商店”肯定会有许多“客户端”。

然而,我不想给一个商店更新/删除“客户”记录的能力,因为真正需要发生的是“商店”将从他们自己的记录中编辑/删除那个“客户”,而不是从一个由“客户”管理的主“客户”表中。

无论如何,使用这种结构,“商店”可以在“clients_shops”表上运行查询,以获得其客户的列表,而“客户”可以运行查询,以获得其“商店”的列表。到目前为止还不错..。

到目前为止,数据库如下所示:

代码语言:javascript
复制
table.clients
client_id (PK, AI, NN)

table.shops  
shop_id (PK, AI, NN)

table.clients_shops  
clients_shops_id (PK,AI,NN)  
client_id (FK)  
shop_id (FK)

ORM如下所示:

代码语言:javascript
复制
shops hasMany clients_shops  
clients hasMany clients_shops

到目前为止还不错(我认为...)但这是我的问题。假设有一个名为'trips‘的第三个表。“trips”表存储有关个人预订的信息,由此“客户”将预订由“商店”提供的“旅行”。这就是我的大脑变得糊涂的地方。我应该如何建立这种关系?

是这样的吗:

代码语言:javascript
复制
table.trips
trips_id (PK,AI,NN)
clients_shops_id (FK) [which would contain keys for both the shop and the client]

或者,有没有更好的方法来做到这一点,比如另一个使用clients.client_idclients_shops.clients_shops_id的表。

提前感谢所有真正读过这篇文章的人!

EN

回答 3

Stack Overflow用户

发布于 2011-03-19 03:08:22

除非你的ORM需要,否则你不需要为客户/商店和所有引用它的东西使用代理外键。

而是创建一个复合PRIMARY KEY,并从其他地方引用它:

代码语言:javascript
复制
CREATE TABLE clients_shops
        (
        client_id INT NOT NULL,
        shop_id INT NOT NULL,
        PRIMARY KEY (client_id, shop_id)
        );

CREATE TABLE trips
        (
        trip_id INT NOT NULL PRIMARY KEY,
        client_id INT NOT NULL,
        shop_id INT NOT NULL,
        trip_data …,
        CONSTRAINT fk_trips_clients_shops
                FOREIGN KEY (client_id, shop_id)
                REFERENCES clients_shops
        );

此模型假设您将客户/商店关系与客户的交易分开维护,除非它们是“相关的”,否则不让客户从商店购买。

您可能希望在客户从商店订购旅行时自动显示关系。在本例中,您只需要第二个表,而第一个表只是一个

代码语言:javascript
复制
SELECT  DISTINCT client_id, shop_id
FROM    trips
票数 1
EN

Stack Overflow用户

发布于 2011-03-19 10:06:04

以下是处理您正在查找的内容的逻辑图。根据您的需求,您可以将非标识关系(Client::Trip & Shop::Trip)更改为标识关系。但是,如果您这样做了,我会将其限制为仅将Shop::Trip更改为识别。如果您认为合适,也可以对基数进行更改。

票数 1
EN

Stack Overflow用户

发布于 2011-03-19 03:11:07

我可能会把trips表做成这样:

代码语言:javascript
复制
table.trips
trip_id (PK)
shop_id (FK to shops)
client_id (FK to clients)
other_trip_column_etc

我不会引用trips表中的m-m表clients_shops -只引用带有单个外键的商店和客户表。

clients_shops表表示客户和商店之间的当前关系。旅行不应该依赖于这些关系,因为它们将来可能会改变,而且您可能不希望旅行的数据随着时间的推移而改变-它应该是一个事务记录,指定在给定的时间确切地安排了哪些商店、客户和旅行,而不管客户和商店之间的当前关系如何。

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

https://stackoverflow.com/questions/5356650

复制
相关文章

相似问题

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