这是我的问题:(使用MySQL)
我有两个实体叫做“店铺”和“客户”。我在“客户”和“商店”之间有一个名为“clients_shops”(CakePHP命名约定)的M:M表。我这样做的原因是,这是一个SaaS应用程序,其中“客户端”可能有许多“商店”,“商店”肯定会有许多“客户端”。
然而,我不想给一个商店更新/删除“客户”记录的能力,因为真正需要发生的是“商店”将从他们自己的记录中编辑/删除那个“客户”,而不是从一个由“客户”管理的主“客户”表中。
无论如何,使用这种结构,“商店”可以在“clients_shops”表上运行查询,以获得其客户的列表,而“客户”可以运行查询,以获得其“商店”的列表。到目前为止还不错..。
到目前为止,数据库如下所示:
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如下所示:
shops hasMany clients_shops
clients hasMany clients_shops到目前为止还不错(我认为...)但这是我的问题。假设有一个名为'trips‘的第三个表。“trips”表存储有关个人预订的信息,由此“客户”将预订由“商店”提供的“旅行”。这就是我的大脑变得糊涂的地方。我应该如何建立这种关系?
是这样的吗:
table.trips
trips_id (PK,AI,NN)
clients_shops_id (FK) [which would contain keys for both the shop and the client]或者,有没有更好的方法来做到这一点,比如另一个使用clients.client_id和clients_shops.clients_shops_id的表。
提前感谢所有真正读过这篇文章的人!
发布于 2011-03-19 03:08:22
除非你的ORM需要,否则你不需要为客户/商店和所有引用它的东西使用代理外键。
而是创建一个复合PRIMARY KEY,并从其他地方引用它:
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
);此模型假设您将客户/商店关系与客户的交易分开维护,除非它们是“相关的”,否则不让客户从商店购买。
您可能希望在客户从商店订购旅行时自动显示关系。在本例中,您只需要第二个表,而第一个表只是一个
SELECT DISTINCT client_id, shop_id
FROM trips发布于 2011-03-19 10:06:04
以下是处理您正在查找的内容的逻辑图。根据您的需求,您可以将非标识关系(Client::Trip & Shop::Trip)更改为标识关系。但是,如果您这样做了,我会将其限制为仅将Shop::Trip更改为识别。如果您认为合适,也可以对基数进行更改。

发布于 2011-03-19 03:11:07
我可能会把trips表做成这样:
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表表示客户和商店之间的当前关系。旅行不应该依赖于这些关系,因为它们将来可能会改变,而且您可能不希望旅行的数据随着时间的推移而改变-它应该是一个事务记录,指定在给定的时间确切地安排了哪些商店、客户和旅行,而不管客户和商店之间的当前关系如何。
https://stackoverflow.com/questions/5356650
复制相似问题