【问题标题】:Abstract versus Separate table design抽象与单独的表格设计
【发布时间】:2016-01-21 19:46:42
【问题描述】:

我的问题是以下数据库/应用程序设计的最佳实践是什么?

我使用 Code First Entity Framework 和 .Net MVC 5。我想在不同的实体上实现一些通用功能。例如考虑以下简化示例:

class Person{
 int PersonId;
 string name;
}

class Member{
 int PersonId;
 int GroupId;
}

class Group{
 int GroupId;
 string name;
}

class Label{
 string name;
}

所以 2 个实体 person 和 group 具有多对多关系。现在我想为每个添加标签以根据业务逻辑过滤数据。有几种方法可以解决:

  1. 具有对任何具有类型列的表的“假”FK 引用的单独“ObjectLabel”表。这可能是不好的做法,但可以简化代码实现并提供更大的灵活性。
  2. 每个实体上要保存的字符串列,例如逗号分隔的标签列表。简单数据库的好处,但当数据扩展时会变慢。
  3. 单独的表,即“PersonLabel”、“GroupLabel”等,以保持参考完整性以便快速查找,但似乎是多余的,需要做更多的工作。

现在我想要一些关于哪种方法最好以及为什么最好的建议?

【问题讨论】:

  • 我会在大多数情况下实施选项 3,这取决于项目的规模,正如您所说。我永远不应该使用选项 1。
  • 我实际上最终选择了选项 1,性能成本将通过适当的表索引最小化,然后我可以在我的代码中利用更简单的抽象业务逻辑的好处。

标签: sql-server entity-framework database-design ef-code-first web-application-design


【解决方案1】:

根据标签是什么以及它们需要多么动态,您可以考虑使用 Enum 标志。这仍然只需要每个表一列,并且肯定会比在列中使用逗号分隔的列表更好地扩展。

您可以查看herehere 的示例,了解如何操作。

【讨论】:

  • 感谢您的建议,但我们的想法是多对一,它们将是完全动态的。想象一下例如 githubs 标签。
  • 其实我现在想想你的建议是可行的。我可以有一个单独的查找表来确定每个数字的含义,并限制每个实体允许的标签数量。如果没有更好的解决方案,我稍后会将此标记为答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多