这是我的问题:(使用MySQL)
我有两个实体叫做“商店”和“客户”。我还有一个M:M表,位于“clients”和“shops”之间,名为“clients\u shops”(CakePHP命名约定)。我这样做的原因是,这是一个SaaS应用程序,其中“客户端”可能有许多“商店”,“商店”肯定会有许多“客户端”。
但是,我不想让商店能够更新/删除“客户”记录,因为真正需要做的是“商店”将从他们自己的记录中编辑/删除该“客户”,而不是从由“客户”管理的主“客户”表中编辑/删除该“客户”。
无论如何,使用此结构,“shop”可以在“clients_-shops”表上运行查询以获取其客户的列表,“client”可以运行查询以获取其“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”表存储有关个人预订的信息,根据这些信息,“client”将预订“shop”提供的“trip”。这就是我的大脑变得模糊的地方。我该如何建立这种关系?
是这样吗:
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的表。
提前感谢所有读过这本书的人!

最佳答案

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

关于mysql - 数据库结构:这种结构是否适合此m:m?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5356650/

10-09 02:06