计算列编辑器

时间:2014-09-27 00:22:22

标签: sql .net

我很抱歉这个有问题的问题,但如果要回答的话,必须准确描述。

我正在SQL Server和.NET winforms中构建模式和数据应用程序。 表ItemType包含项的类型,表ItemTypeColumn包含每种类型的列,最后,表ItemData包含应用程序的所有数据

这些例子如下:

<ul>
    <li>ItemType: Customer, Customer Category, etc</li>
    <li>ItemColumn: Customer Name, Description etc</li>
    <li>ItemData: John Doe, International, etc</li>
</ul>

这导致了一个非常有趣的数据检索链。例如:

<ul>
    <li>Customer X is item ID 100</li>
    <li>Category Y is item ID 60</li>
    <li>To indicate that Customer X is of category Y - (to point towards it) we need to find the line that combines ItemID=100, ItemColumnID=[whatever the id of the item ItemColumn is] and then update the field Data with the ID of Category X (60).</li>
</ul>

我使用Select语句检索数据,如下所示:

SELECT * FROM (
         SELECT ItemData.ItemID, 
                IC.ItemTypeID,
                MAX(CASE WHEN ItemData.ItemColumnID = 28 
                    THEN ItemData.Data ELSE NULL END) AS "Name",
                        MAX(CASE WHEN ItemData.ItemColumnID = 32 
                        THEN ItemData ELSE NULL     END) 
                AS "Code"
         FROM ItemData as Data 
         INNER JOIN (
               select * 
               from ItemColumns
               where ItemTypeID=7) as IC
         on ItemData.ItemColumnID=IC.ID
         GROUP BY ItemData.ItemID, IC.ItemTypeID) as table1
         INNER JOIN Item ON Item.ID=table1.ItemID

这就像一个魅力。

现在,我想让我的用户能够创建能够选择的计算列:

<ul>
    <li>A column from this type item</li>
    <li>A column from a parent type item</li>
    <li>A value from a child type item </li>
    <li>The specific data found in a specific row id</li>
</ul>

以下是一个例子:

<ul>
    <li>Item Type "Country" has 1 field: Name</li>
    <li>Item Type "City" has 3 fields: Name, Population, Country (pointing to parent country)</li>
</ul>

我想让用户能够创建将保存计算数据的新列(而不是数据输入,如“名称”或“解密”)。

我设法创建了一个表达式构建器和一个实际工作的解析器。考虑到上面的例子,您可以在类型Country中创建一个Urban Population列,其中包含每个国家/地区所有“children”城市的列人口总和。这是我用User Defined Functions和我在select语句中调用的虚拟列。

这是问题(最后):如果我想创建一个计算列,引用另一个计算列,例如农村人口 - 这将显示国家人口(数字字段)减去城市城市之和(人口字段总和) “子城市”)它将无法工作,因为新的“创建”(在选择表中)列不能被同行引用。

一般来说,我觉得我在计算字段方面走错了路。有没有最好的做法可以遵循?我的方法有误吗?是否存在计算错误计算错误的解决方法?

提前谢谢 - 再次,我很抱歉这个问题的篇幅很长。

2 个答案:

答案 0 :(得分:0)

您在数据库设计中采用的方法是“名称/键值对”。事实上,您还要进一步将聚合数据存储在相同的名称值对结构中。这种方法看起来非常灵活且非常诱人,但是架构的RDBMS并没有为这种方法设计。 这种方法非常适用于小数据不具备大数据的情况。因此,这个孩子的设计大多在发布后的几个月内就无法生产。

请参考以下链接: http://geekswithblogs.net/darrengosbell/archive/2006/03/12/KVPsInDatabaseDesign.aspx

始终建议使用显式列名和定义来设计RDBMS。

我通常会注意到聚合需求的数量和类型不是很复杂且非常不同,而且大部分都可以提前确定。因此劝阻你的这种做法。 在一些绝对需要灵活性的场景中,可以使用外部工具,例如:tableau,R或Python Panda / iPython等。我理解这些工具可以使用用户需要来学习它们。

Nassosk真的值得称道,你可以在原帖中实现你所说的一切,我会有兴趣看到你的代码:-)。

看起来你正在设计一个基于数据库的数据库: - )

谢谢

答案 1 :(得分:0)

从我在这里和其他地方读到的内容,我的问题就是问“如果我想跳下一座摩天大楼,我该怎么办” - 大多数人会告诉你不要跳,而不是给你5美分: )

无论如何,因为到目前为止我已经做了很多工作,我以为我可能会有尊严地失败并一直走下去,所以这就是答案:

由于我的select语句实际返回一个虚拟表(它转换数据),在数据集中添加所有相关表似乎完全合理,在数据集中即时创建它们之间的关系(是的,@ user3851404 在数据库上构建一个数据库,虽然这是非常有益的)并将Expression属性设置为我想要显示来源数据的数据列中的my formula。

它实际上按预期工作。我不会评论性能,因为我还没有对它进行压力测试,但无论性能如何,似乎这是唯一的解决方法。