【问题标题】:building complicated relationships in a relational database在关系数据库中建立复杂的关系
【发布时间】:2017-08-04 03:53:15
【问题描述】:

我有一个关于关系数据库设计的一般性问题。我有一个表中的大量对象列表。这些对象被分类为三个描述符类。有distributor1、distributor2和distributor3。为了描述一个对象,人们总是构建这些描述符的三元组。

例如假设描述符 1 是颜色,描述符 2 是大小,描述符 3 是重量。对于每个对象,我会构建一个描述该对象的三元组。 就我而言,每个描述符都有数千个条目。所以我为每个描述符建立一个表。我现在如何构建三元组并将其与对象表中的对象相关联?

如果每个对象只有一个这样的三元组,我可以将每个对象中的三个描述符 id 作为外键存储,但我们假设每个对象可以有 0 个或多个这样的三元组。

我正在使用 sqlalchemy,但我很乐意自己编写代码,我只是在文档中寻找要查找的关键字,因为到目前为止我找不到太多。

我的解决方案是创建另一个具有三个描述符 ID 和对象 ID 的表。这是要走的路吗? 我还可以在每个对象中存储一个包含三倍描述符 id 的字符串……但这似乎非常违反关系数据库的原则……

【问题讨论】:

  • 如果每个对象总是有这三个值,我会创建一个新表:obect_id、attr1_id、attr2_id、attr3_id。但是,如果有任何差异,我会将每个属性及其值存储在与其他属性不同的行中。
  • “但是,如果有任何差异,我会将每个属性及其值存储在与其他属性不同的行中”是什么意思?

标签: database sqlalchemy relational-database relationship flask-sqlalchemy


【解决方案1】:

很少有适合所有场景的完美设计。如果您知道您永远不需要另一个属性并且您将始终使用所有三个属性查找该行,那么您所描述的内容会很好。这取决于您的用例,但这些都是非常有限的假设。

添加更多属性或通过 1 或 2 个属性而不是全部 3 个属性来查找记录是 Lucas 建议添加可索引的附加列更灵活的时候。在非聚集索引中定义任意一组列的能力是关系数据库倾向于获得大量搜索性能/灵活性的地方。

【讨论】:

  • 感谢您的回答。确实在某些情况下,我需要 2 或 1 个描述符而不是三元组。但是,我不确定您添加列的解决方案将如何工作?向对象表添加列?有多少列,它们的外观如何?
  • 考虑 Lucas 描述的对象表: ObjectTable Object_Id Attr1_ID Attr2_ID Attr3_ID 现在考虑针对该对象表的不同选择语句: Q1:Select * from Object where Attr1_ID = 5 或 Q2:Select * from Object where Attr1_ID = 5 和 Attr2_ID = 2 您可以根据需要向对象表中添加任意数量的属性列。两个 select 子句可能使用单个索引 Index_A (Attr1_ID,Attr2_ID) 但是创建一个专用于 Q1 的索引会比 Index_A 更小并且更便宜。 Index_B(Attr1_ID)
猜你喜欢
  • 2013-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-03
相关资源
最近更新 更多