【发布时间】:2016-04-11 15:58:44
【问题描述】:
我正在努力寻找以 SQL (MySQL DB) 和 C# windows 形式存储和表示数据的最佳方式。
我的数据映射到如下所示的类时;
public class Parent
{
public string UniqueID { get; set; } //Key
public DateTime LoadTime { get; set; }
public string Reference { get; set; }
private List<Child> Elements { get; set; }
}
public class Child
{
public int MemberCode { get; set; } //Composite key
public int ElementCode { get; set; } //Composite key
public Object Data { get; set; }
}
我的数据非常动态。所以父记录可以有任意数量的子记录。
在子记录中,MemberCode 和 ElementCode 实际上是其他表/类的外键,当执行查找时,它会为我提供有关数据实际内容的详细信息。例如
MemberCode = 1 & ElementCode = 1 means data is a Date
MemberCode = 1 & ElementCode = 3 means data is a telephone number
MemberCode = 2 & ElementCode = 11 means data is a Product Code
MemberCode = 2 & ElementCode = 12 means data is a Service Code
etc
这些有效地结合起来表明列名是什么,并且它们总是相同的(因此 MemberCode = 1 & ElementCode = 1 将始终是 Date 无论它与哪个子对象关联)。 目前这些是引用/查找,但我也可以将数据放在类中的变量中,因为这可能会更容易。那么它更像是一个键值对。
目前在我的数据库中,我将它们存储为两个表,子记录还包含来自父级的 UniqueID。但我不确定这是否是我将要解释的最佳方式。
我的表就是这样创建的
CREATE TABLE `PARENT` (
`ID` INT(11) NOT NULL AUTO_INCREMENT,
`LOADTIME` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`REFERENCE` VARCHAR(100) NOT NULL,
PRIMARY KEY (`ID`)
)
CREATE TABLE `CHILD` (
`ID` INT(11) NOT NULL,
`MEMBER_CODE` INT(11) NOT NULL,
`ELEMENT_CODE` INT(11) NOT NULL,
`DATA` VARCHAR(4000) NULL DEFAULT NULL,
PRIMARY KEY (`ID`, `MEMBER_CODE`, `ELEMENT_CODE`),
CONSTRAINT `fk_ID` FOREIGN KEY (`ID`) REFERENCES `Parent` (`ID`)
)
现在我想做的是展平这些数据,以便我可以将单个父记录与所有子记录显示为一行。理想情况下,我想在 ObjectListView (http://objectlistview.sourceforge.net/cs/index.html) 中显示它,但如果它能让生活更轻松,可以考虑使用 datagrid。
因为我的数据是动态的,所以我很难把它弄平,如果我选择 10 个父记录,那么每个记录可以有不同数量的子元素,每个可以有不同的 MemberCodes 和 ElementCode,这意味着它们是有效的不同的列。
所以我的数据可能如下所示(但规模更大);
但由于数据的动态特性,我很难做到这一点。在我的代码中的 SQL 或对象中。也许还有另一种更适合我的数据存储方式。
【问题讨论】:
-
您能否为您的数据库对象编写脚本,以便我们了解您当前如何存储这些对象?另外,父母可以有几个具有相同元素代码的孩子吗?所有元素代码的列表是固定的还是动态的?
-
我为表添加了数据库创建脚本,并澄清了memberCode,elementCode。基本上这些在所有子对象中总是相同的。
-
还请说明属性列表是否固定 - 即您是否经常添加对
{MemberCode;ElementCode}- 或者它们是预定义的? -
MemberCode (MC) 和 ElementCode (EC) 是预定义和固定的。 1 个 MC 可以有多个 EC。例如:MC 1 = 呼叫信息。这可以有多个 EC。 EC 1 = 日期,EC 3 = 电话号码。然后我可以有 MC 40,这可以有 EC 1 = 日期,EC 3 = 电话号码,EC 5 = 金额等。但是数据库中定义的 MC 和 EC,但我将它们读入参考表,因为它们是固定的(虽然理论上它们可以在每次部署时更改,任何更改往往是扩展而不是更改并且很少见。)