很好地管理查找表

时间:2015-04-17 06:41:45

标签: postgresql database-design

我们有一个people表,每个person都有一个由gendergender_id表定义的genders

| people    |
|-----------|
| id        |
| name      |
| gender_id |

| genders |
|---------|
| id      |
| name    |

现在,我们希望允许人们使用漂亮的表单构建器自己创建表单。我们要添加的元素之一是选择list,其中包含用户定义的options

| lists |
|-------|
| id    |
| name  |

| list_options |
|--------------|
| id           |
| list_id      |
| label        |
| value        |

但是,他们无法使用genders作为下拉列表,因为它位于不同的表中。他们可以使用与genders相同的选项创建新列表,但这不是很好,如果添加了新的性别,他们需要将其添加到多个位置。

因此,我们希望将性别选项移动到用户可以随意编辑的列表中,并在创建新人时反映出来。

genders移至listlist_options同时在gender_id表格中仍有people(或类似)列的最佳方式是什么? ?到目前为止我的想法包括;

  1. 创建一个包含已知ID的“魔术”列表,并始终假设其中包含性别选项。

    • 不是很喜欢这个,因为它听起来像是使用'魔术'数字。代码将需要系统级选择框之间的某种“映射”和它们的含义
  2. 不要使用“魔术”列表,而是将其移到用户可以选择的选项中,以便他们可以选择包含性别的列表。

    • 这并没有太大的不同,但ID不会被硬编码。虽然
    • 需要更多工作来查看数据库表
  3. lists表上放置某种列,将其标记为从另一个表中提取其选项。
    • 可能需要更多(更复杂)的代码才能使其正常工作。
  4. 我不确定如何工作的某种多态表我只是想过并想忘记之前写下来。
    • 不知道这是如何工作的,因为我只是有了这个想法

1 个答案:

答案 0 :(得分:1)

最简单的解决方案是将list_options表更改为视图。如果您有多个表,则需要有一个列表下拉列表以从此表中提取,只需将UNION结果集合在一起。

SELECT 
   (your list id here) -- make this a part primary key
   id, -- and this a part primary key
   Name,
FROM dbo.Genders 

UNION 

SELECT 
   (your list id here) -- make this a part primary key
   id, -- and this a part primary key
   Name,
FROM dbo.SomeOtherTable

这样,只要数据发生变化,它就会自动更新。现在你想要测试这个,好像这个变大了它可能会变慢,你可以通过在应用程序中只拉一次所有这些信息来解决这个问题(或者说缓存30分钟然后刷新以防万一) 。

您的第二个选择是创建一个表list_options,然后创建一个程序(等),该程序遍历所有其他查找表并提取信息以进行编译。这对于应用程序性能来说会更快,但它需要您保持同步。处理这个问题的最简单方法是创建一系列触发器,当查找表中的某些内容发生更改时,这些触发器将重建部分(或整个)list_options表。在这一篇中,我建议不要创建自动生成的主键并移动到复合键,就像我在视图中提到的那样。由于这将被重建​​,id将会改变,所以最好不要认为价值完全稳定。使用复合(list_id,lookup_Id),无论该行插入表中多少次,它都应该始终相同。