2015-10-19 103 views
0

如果我正在接近这个错误,我很乐意就我的整体逻辑和设计提出建议。我会先解释这个问题和我的解决方案。如何从多个表中的一个自动选择?

我必须收集几种类型的数据(varchar,money,real,bit),但每个记录可以收集每种类型0-1000+。例如,记录1可能有40个varchar字段和500个货币字段,需要存储。

所以我想我会做4个表,每个数据类型一个,如下所示。理论上的记录号码1数据如下图所示:

----------------------------------------------- 
    |record(int)|fieldname(varchar)|value(varchar)| 
    |-----------|------------------|--------------| 
    |1   |field1   |test a  | 
    |1   |field2   |test b  | 
    ----------------------------------------------- 
    (imagine 40 rows here total) 

    ----------------------------------------------- 
    |record(int)|fieldname(varchar)|value(money) | 
    |-----------|------------------|--------------| 
    |1   |field3   |111   | 
    |1   |field4   |222   | 
    ----------------------------------------------- 
    (imagine 500 rows here total) 

    ----------------------------------------------- 
    |record(int)|fieldname(varchar)|value(real) | 
    |-----------|------------------|--------------| 
    (no real data to store for record 1) 

    ----------------------------------------------- 
    |record(int)|fieldname(varchar)|value(bit) | 
    |-----------|------------------|--------------| 
    (no bit data to store for record 1) 

我正考虑一个表,4列VARCHAR,钱,真正的,和位。但是,我只会使用每行4列中的1列,它看起来并不是最好的方式。

这是一个愚蠢的设计?现在接下来的问题是:如何从正确的表格中选择变量名称而不必指定数据类型?除了做4个单独的查询,直到我得到一个结果。我正在考虑使用3个联盟,为每个表制造3个缺失的列。这是最好的方法吗?

+0

我将编辑我的问题。当我说字段时,我的意思是数据。我不想在示例表中创建500行,但想象每条数据有一行。我会编辑我的问题来澄清。 –

+0

拥有4列,其中3个是NULL不会为每个记录添加任何额外的存储。在同一个记录中查询4个表的性能可能在这种情况下更具影响力。 –

+0

Jason W - 我不知道。我认为只是有一个数据类型和行将使用存储,即使它是空的。我想我会把它们全部放在一张表中。谢谢! –

回答

1

如注释中所述,对于变量长度字段为空的行,SQL Server不会为每行记录添加额外的存储空间。

对于允许空值的列,每一行都有一个空位图。如果 列中的行为空,则位图中的位为1,否则为0.

对于可变大小的数据类型,实际大小为0字节。

对于固定大小的数据类型,acctual大小是默认数据类型大小 以字节为单位设置为默认值(0表示数字,'表示字符)。

对于进一步阅读:http://weblogs.sqlteam.com/mladenp/archive/2007/09/06/How_does_SQL_Server_really_store_NULL-s.aspx

+0

谢谢。我有点尴尬,因为我缺乏基本的理解,几乎导致我为一个不存在的问题创建了一些麻烦的,肮脏的解决方案。很高兴我先问这里! –