database - 多个可为空的外键与多个资源表
问题描述
我们正在设计一个系统,其中我们有两种类型的实体公司和财产。Property 和 Company 都有自己的媒体资源(视频、照片),因此我们正在讨论在数据库级别处理此问题的两种方法。
首先是拥有一个 Media 表,该表对 Company 和 Property 都具有可为空的外键
第二个是对于 Company 和 Property 我们将有 CompanyMedia 和 PropertyMedia
这些方法中哪一种更有意义?
编辑:
应该因为提出解决方案 No2 而被杀:)。
解决方案
第二种方法是禁止恕我直言。media_url和media_type属性在数据库中必须是唯一的。否则,您将面临重复和同步问题的风险。
型号 2 的问题示例:
- 一种媒体链接到公司 1。它的类型是“视频”。
- 相同的媒体(即 URL)链接到属性 1。它的类型是“博客”。
- 如果您想要所有媒体及其类型的列表,现在会发生什么?你会拿哪一个?
- 而且您必须查询 2 个效率低下的表。
我在这里看到 4 张桌子。公司、财产、媒体和媒体类型。媒体类型也应该有它自己的表,以避免重复。
因此:
Company
idCompany
CompanyName
Property
idProperty
PropertyName
Media
idMedia
MediaURL
idMediaType, FK to MediaType
MediaType
idMediaType
Type
和链接表:
Property_has_Media
idProperty
idMedia
Company_has_Media
idCompany
idMedia
模型:
如果一种媒体从不与公司和财产联系起来,我建议采用这种结构。从你的问题来看,这是我的理解。从概念上讲,媒体没有定义公司和财产之间的链接,因此拥有 2 个单独的链接表更有意义。它还将避免在您的查询中出现“IS NOT NULL”。
推荐阅读
- python - TF 2.0 @tf.function 示例
- python - 正则表达式:删除字符串中间的零(但保留末尾的零)
- c# - 如何在 EF 中为 MSSQL 获取隔离级别?
- php - 使用 laravel 上传 img 进行验证
- c++ - 我该如何解决这个问题,我需要从文本文件中导出一行?
- php - 当不使用`return`语句结束php函数时,它是否被认为是“坏风格”?
- spring-boot - 如何将基于 JDBC URL 的测试容器迁移到 Junit 5
- excel - 循环工作表并创建表格
- java - 为什么 ThreadLocal 不在新线程中创建?
- c# - 在同一个解决方案中访问 API