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

Posted

技术标签:

【中文标题】数据库结构:这个结构可以与这个 m:m 一起使用吗?【英文标题】:Database structure: Would this structure work with this m:m? 【发布时间】:2011-03-18 19:03:47 【问题描述】:

这是我的问题:(使用 mysql

我有 2 个实体,分别称为“商店”和“客户”。我在“clients”和“shops”之间还有一个名为“clients_shops”(Cakephp 命名约定)的 M:M 表。我这样做的原因是这是一个 SaaS 应用程序,其中“客户”可能有很多“商店”,而“商店”肯定会有很多“客户”。

但是,我不想让商店能够更新/删除“客户”记录,因为真正需要发生的是“商店”将从他们自己的记录中编辑/删除该“客户”,而不是来自“客户”管理的主“客户”表。

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

到目前为止,数据库看起来是这样的:

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 AND clients_shops.clients_shops_id 的表。

提前感谢所有真正阅读整本书的人!

【问题讨论】:

假设您与客户 A 和商店 X 进行了一次旅行 - A 和 X 必须在 clients_shops 中,如果从 clients_shops 中删除会发生什么情况,必须从旅行中删除吗? 【参考方案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

【讨论】:

即使 ORM 需要单个整数 id,OP 仍然需要对 clients_shops (client_id, shop_id) 的 UNIQUE 约束。【参考方案2】:

这是处理您要查找的内容的逻辑图。根据您的要求,您可以将非识别关系(Client::Trip & Shop::Trip)更改为识别关系。如果您这样做,我会将其限制为仅将 Shop::Trip 更改为识别。还可以根据需要更改基数。

【讨论】:

【参考方案3】:

我可能会这样制作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 - 只需使用单独的外键引用 shop 和 client 表。

clients_shops 表表示客户与商店之间的当前关系。旅行不应依赖于这些关系,因为它们在未来可能会发生变化,而且您可能不希望旅行的数据随着时间的推移而改变 - 它应该是一个交易记录,可以准确地指定商店、客户和旅行是什么安排在给定时间,而不管该客户与商店之间的当前关系。

【讨论】:

以上是关于数据库结构:这个结构可以与这个 m:m 一起使用吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以将 typedef 结构与指针一起使用吗?

IN可以使用结构构造函数语法与多部分键一起使用吗?

可以在这个 PowerShell 脚本中使用正则表达式吗?

使用指针调用非托管代码

数据结构可以由另一个数据结构构成吗?

数据结构哈希表