2011-03-18 50 views
1

这是我的问题:(使用MySQL)数据库结构:此结构是否适用于m:m?

我有2个实体称为'商店'和'客户'。我还有一个名为'clients_shops'的'客户'和'商店'之间的M:M表(CakePHP命名约定)。我这样做的原因是,这是一个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 

到目前为止好(我想...)但这是我的问题。假设有一个名为'旅行'的第三个表。 “旅行”表存储有关个人预订的信息,由此“客户”将预订由“商店”提供的“旅行”。这是我的大脑越来越糊涂的地方。我应该如何设定这种关系?

是这样说:

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另一个表。

预先感谢任何人,实际上读这整个事情!

+0

假设你有一个客户A和店铺一趟X - 必须A和X是clients_shops并且如果从clients_shops必须将其从旅行随之删除,会发生什么? – Mark 2011-03-18 19:08:26

回答

1

除非您的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 
+0

即使ORM需要单个整数ID,OP仍然需要对clients_shops(client_id,shop_id)有UNIQUE约束。 – 2011-03-18 20:28:40

0

我可能会做的车次表是这样的:

table.trips 
trip_id (PK) 
shop_id (FK to shops) 
client_id (FK to clients) 
other_trip_column_etc 

我不会引用毫米表clients_shops从旅程表 - 只需参考商店和客户表与个人外键。

clients_shops表代表客户和商店之间的当前关系。这次旅行不应该依赖于这些关系,因为它们可能会在将来发生变化,并且您可能不希望旅行的数据随时间而改变 - 它应该是一个交易记录,用于指定商店,客户和旅程是什么无论当前客户与商店之间的关系如何,都可以在该给定时间安排。

1

以下是处理您要查找的逻辑图。根据您的要求,您可以将非身份验证关系(客户::旅行& Shop :: Trip)更改为识别关系。如果你这样做,但我会限制它只是改变Shop :: Trip来识别。如果您认为合适,请对基数进行更改。

enter image description here