我们有一个people
表,每个person
都有一个由gender
到gender_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
移至list
和list_options
同时在gender_id
表格中仍有people
(或类似)列的最佳方式是什么? ?到目前为止我的想法包括;
创建一个包含已知ID的“魔术”列表,并始终假设其中包含性别选项。
不要使用“魔术”列表,而是将其移到用户可以选择的选项中,以便他们可以选择包含性别的列表。
lists
表上放置某种列,将其标记为从另一个表中提取其选项。
答案 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),无论该行插入表中多少次,它都应该始终相同。