我们已经实现了一个包含ID和文本字段的查找表。然后我的表只包含不同字段值的LookupID。例如......
表
值看起来像这样
LookupTable中
值看起来像这样
我需要知道的是,这是否是对这些表的查询最有效的解决方案(创建显示文本而不是ID的数据的sql视图)
class A
include Checks
def initialize(h)
@h = h
end
def confirm_all(g)
Checks.instance_methods.all? { |m| send(m, g) }
end
end
a = A.new(:colour=>:blue, :size=>:medium, :weight=>10)
a.confirm_all(:colour=>:blue, :size=>:medium, :weight=>10)
#=> true
a.confirm_all(:colour=>:blue, :size=>:large, :weight=>10)
#=> false
...或者子查询是否更适合此解决方案?这样的事情。
SELECT T.TableID, L1.Text as StatusText, L2.Text as TypeText, L3.Text as DocText
FROM Table T
LEFT JOIN LookupTable L1 on L1.LookupID = T.StatusID
LEFT JOIN LookupTable L2 on L2.LookupID = T.TypeID
LEFT JOIN LookupTable L3 on L3.LookupID = T.DocID
......或者有更好的解决方案吗?请记住,此示例我只加入了3次,需要加入10次或更多次。
答案 0 :(得分:1)
您最好的选择是为数据库中的每个单独实体创建单独的查找表。如果您需要为单个查找类型添加其他属性,这将为您提供更好的灵活性(例如,现在您需要跟踪每个州的状态鸟,但这肯定与汽车模型无关)。根据我的经验,“通用”数据库设计模式通常会变坏。设计有目的。
一旦有了这个,只要你拥有多个JOIN
的适当索引,几乎总是(如果不是总是)比子查询表现更好:
SELECT
P.person_id,
S.state_name,
G.movie_genre_name,
...
FROM
Person P
INNER JOIN [State] S ON S.state_id = P.home_state_id
INNER JOIN Movie_Genre G ON G.movie_genre_id = P.favorite_movie_genre_id
...
另外,请记住,系统中的每个列表都不一定是查找表。例如,可以通过CHECK CONSTRAINT
:
gender VARCHAR(15) NULL CONSTRAINT CHK_Person_Gender CHECK (gender IN ('Male', 'Female', 'Transgender'))
或:
severity VARCHAR(10) NOT NULL CONSTRAINT CHK_Ticket_Severity CHECK (severity IN ('High', 'Medium', 'Low'))
这与基本上只是名称的列表相关。具有可能随时间频繁变化的附加属性或列表的项目的列表应放入表格中。
答案 1 :(得分:0)
您是否考虑过使用UNPIVOT来解决问题?