相关疑难解决方法(0)

将不同实体链接到单个表的最佳方法

我正在竞选公职,并创建了一个网络应用程序,用于跟踪我在家中向选民敲门的情况。该数据库包含一个名为的表voters,其中包含有关我社区中选民的所有必要信息。我正在使用 mysql。

我想添加一个新功能来跟踪我的竞选活动的捐助者。并非所有这些捐助者都住在社区,也不在我竞选公职的地区投票。我不需要为这些人跟踪与我为选民所做的相同类型的信息,因此我将这些人放入一个名为的表中nonvoters.

现在,我voters表中的个人也可以进行捐赠,我也想跟踪这些人。

最后,我还想跟踪组织的捐赠,因此我还需要一个organizations表来存储有关组织的信息。

为了跟踪来自选民、非选民和组织的捐赠,我想建立一个名为donations.该表的新表,该表将包含有关每笔捐赠的适当详细信息。

但我不确定其最好的结构是什么样的连接donations表的votersnonvotersorganizations表应该是。如果我donor_id在表中创建一个名为的列以将其键入捐赠者信息,则无法知道该 ID 指的是哪个表。那么我是否设置三列,nonvoter_id,voter_idorg_id并根据捐赠者是否是选民将 ID 插入适用的列中?这看起来很奇怪。

或者,我可能会在三个表中的每一个中创建一个新列,称为donor_id我可以用来将我的数据链接到捐赠表。如果我走这条路,似乎我必须做一些幕后工作,以确保donor_id 是唯一的,并且与捐赠表中的数据相关联。

或者也许还有其他我不熟悉的方法。任何指导表示赞赏。

database-design subtypes

5
推荐指数
1
解决办法
1016
查看次数

何时为同一字段添加另一个查找表

例子

  • Table Recipe 使用查找表来查找 Recipe Category;
  • Table Ingredient 使用 Ingredient Category 的查找表;
  • 它们处于多对多关系;
  • 配方类别不会用作成分类别,反之亦然;

它应该是单独的查找表,还是我可以使用一个带有额外列的表来确定它是成分还是配方类别?这会影响优化或查询速度吗?

如果单表大约有 100 条记录;分隔的表是 5 和 95。该表将在同一个查询中出现两次以上。

我测试了相关问答关系表中的想法,内容相同,自定义解决方案。在前端和内务处理方面更容易处理数据,但如果数据库增长,数据完整性可能会成为一个问题。

澄清

  1. 一个配方可以按多个配方类别进行分类
  2. 一种成分可以按多个成分类别进行分类
  3. 业务领域有5个菜谱类别
  4. 业务领域有95个成分类别
  5. 具体食谱类别的三个示例是 Omivorous、Vegetarian、Vegan。
  6. 具体成分类别的三个示例是谷物、肉类、鱼类。

我一直在测试这两种解决方案,但由于记录太少,我看不到任何性能改进或损失。此外,在构建前端时,使用一个模型和一个列比使用 2 个模型更容易,但这是一个小问题。

Stack Overflow 上的相关问答:一个查找表还是多个查找表?

database-design

5
推荐指数
1
解决办法
516
查看次数

一个通用映射表 VS 许多特定映射表

我正在尝试设计数据库表来跟踪最终用户上传的文件。
文件可以在不同的上下文中上传。
每个上下文都是一个不同的表。

举个例子:

  • 员工可以针对“每周费用”条目上传多个“收据”文件。
  • 员工可以针对“宠物”条目上传多个“照片”文件。

这个(人为的)场景中的实体/表是:

  • Employees (Id, Name)
  • Expenses (Id, Date, RequestedRefund, RequestedByEmployeeId)
  • Pets (Id, Name, Type, BelongsToEmployeeId)

我已经有一个名为的表Files,用于跟踪有关文件本身的信息:
Files (Id, Name, Size, Extension, Folder)

我的问题是关于如何根据文件记录映射费用收据上传和宠物照片上传。我知道我可以通过两种方式做到这一点:

第一个选项:

有一个通用映射表:GenericFileMap (FileId, ContextId, Type)
where

  • FileId 是文件记录的id
  • ContextId 是我试图检索的上下文记录的 ID
  • Type 是描述上下文本身的字段

在这种情况下,我会像这样获取员工的所有费用收据:

SELECT *
FROM Employee e
INNER JOIN Expenses ex ON e.Id = ex.RequestedByEmployeeId
INNER JOIN GenericFileMap g ON g.ContextId = ex.Id AND g.Type = 'expense'
INNER JOIN Files f ON g.FileId = f.Id
Run Code Online (Sandbox Code Playgroud)

第二个选项:

每个实体/上下文表都有单独的映射表: …

database-design sql-server table

5
推荐指数
1
解决办法
2309
查看次数

标签 统计

database-design ×3

sql-server ×1

subtypes ×1

table ×1