mysql - 数据库结构 : Would this structure work with this m:m?

标签 mysql database-design cakephp orm m2m

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

我有 2 个实体,分别称为“商店”和“客户”。我还有一个位于“客户”和“商店”之间的 M:M 表,称为“clients_shops”(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

到目前为止一切顺利(我认为......)但这是我的问题。假设有第三个表名为“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_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 - 数据库结构 : Would this structure work with this m:m?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5356650/

相关文章:

Mysql查找最小值和日期,从某一行开始

php - 如何在 PHP 中获取 : one to many to some to many?

Php复选框被选中,然后mysql update 1,如果没有选中mysql update 0

mysql - 将 2000 万条记录存储在 MySql 中的一个表或两个单独的表中,每 1000 万条?

CakePHP 2.1.0 : How to Create "Down for Maintenance" Page

mysql - 显示 SQL 查询的准确时间

sql - 关于数据库设计的疑问

c# - "Data Massage"是什么意思?

mysql - 将别名 Mysql 转换为 cakePHP find 语句

php - 根据 CakePHP 3 中的角色授权用户