我研究了提到的5种方法here
我仍然无法找到一个实现我正在创建的新数据库设计。上述每种方式都有它的优点和缺点,缺点不适合我的需要。
我将简要解释我需要什么。 我的公司有各个部门,每个部门都有类别(我只是列举一些例子):
视频修改(VE) cat 1 :活动 cat 2 :剪辑 cat 3 :生产
平面设计(GD) cat 1 :数码相册 cat 2 :照片处理 cat 3 :照片修饰
如您所见,每种产品都有完全不同的属性。
截至目前,我为每个部门都有一个Excel文件,其中每个文件都有所有客户的标签(这就是我制作数据库的原因)。
现在,在我的网站上,每个类别都有一个ORDER FORM,专为该类别中的属性设计。我在将这个实现到ORDERS表层次结构中时遇到了麻烦。
正如你在我的截图中看到的那样(不介意命名......我使用了“属性”,所以你可以看到它是什么。我将把它改为“att”。我也刚刚制作一些用于测试的基本列)当客户从这些类别订购产品时,四个权利表就是今天的订单形式。因此,如果您考虑一下,它们应该是与ORDER_DETAIL表的一对一关系(就像我在屏幕截图中对其中一个做的那样),因为您在订单中只能有一行。但我想到的一个问题是名称“order_detailsID”不匹配,我已经知道关系键应该具有相同的名称......我不能将属性表的PK命名为“order_detailsID”,因为那不是什么它是...它的属性。
也许我的ORDERS和ORDERS_DETAILS错了......我不知道。我需要帮助来弄清楚如何让客户能够订购产品并基于此,获得适当的属性表来填写一行。
(当然,att表中的FK“order_detailsID”字段未被使用,因为我不知道是否需要它们。)
你会建议什么?
点击HERE获取较大的原始质量屏幕截图。
答案 0 :(得分:1)
所以在四个表中
Video_clips_att
Video_events_attributes
GD_album_attributes
GD_manipulation_att
您可以在Order_details或订单上使用外键。
这取决于您是想通过Order_details将每个属性连接到特定产品,还是仅通过订单中的特定订单连接。
像
这样的查询SELECT Video_clips_att.* FROM Video_clips_att INNER JOIN Order_details ON Video_clips_att.order_detailsID = Order_details.order_detailsID INNER JOIN Orders ON Order_details.orderID = Orders.orderID WHERE orderID = N'…';
SELECT Video_events_attributes.* FROM Video_events_attributes INNER JOIN Order_details ON Video_events_attributes.order_detailsID = Order_details.order_detailsID INNER JOIN Orders ON Order_details.orderID = Orders.orderID WHERE orderID = N'…';
SELECT GD_album_attributes.* FROM GD_album_attributes INNER JOIN Order_details ON GD_album_attributes.order_detailsID = Order_details.order_detailsID INNER JOIN Orders ON Order_details.orderID = Orders.orderID WHERE orderID = N'…';
SELECT GD_manipulation_att.* FROM GD_manipulation_att INNER JOIN Order_details ON GD_manipulation_att.order_detailsID = Order_details.order_detailsID INNER JOIN Orders ON Order_details.orderID = Orders.orderID WHERE orderID = N'…';
将返回属于特定订单的四个集合,即每个集合中的一个。
现在,当您在应用程序中使用此数据时,您可以这样做:
public class IOrder {
public ICollection<IOrderAttributes> OrderAttributes;
}
public class Order : IOrder {
public ICollection<VideoClipAttributes> GetAllVideoClipAttributes {
return OrderAttributes.Where(x => typeof(x) == typeof(VideoClipAttributes)).Select(x => (VideoClipAttributes)x);
}
}
public class OrderAttributes : IOrderAttributes {
//work and stuff
}
public class VideoClipAttributes : OrderAttributes
{
//more work and stuff
}
好吧,你明白了。
从所有这四个表中获取数据并将其放入四种不同的类型(从相同类型继承,然后将它们全部放在一个合理分离和抽象的漂亮集合中)并不会太多工作。如果您希望能够通过各自的产品识别每个属性对象,则应在属性表上使用order_detailsID外键。
这将起作用,因为order_details表不必将外键返回到属性表,因此您不需要人工层超越来维持该关系。
编辑2016-10-24:
由于您需要一个订单到一个属性关系,一个明智的解决方案是将您的四个表合并为一个:
Order_attributes{
attributesID
orderID
video_clips_typeID
employeeID
video_clip_statusID
title
date
languageID
song_choiceID
video_event_typeID
video_event_statusID
unique_name
bride_name
groom_name
other_name
album_typeID
GD_album_statusID
need_names
spreads
size_w_mm
size_h_mm
has_cover
cover_size_w_mm
cover_size_h_mm
raw_image_amount
GD_manipulation_detailID
GD_manipulation_statusID
attributes_type
}
然后,您的订单可以有这样的成员:
public class IOrder {
IOrderAttributes attributes
}
要与数据库连接,您可以拥有一个类OrderAttributesStore,它可以精确复制订单属性表的架构,但是当您构建订单的单个实例时,您可以执行以下切换:
switch (OrderAttributesStore.AttributesType){
case 0:
return new VideoClipsAttributes(){property=value,...};
Case 1:
...
}
这就是这件事的作用:https://dotnetfiddle.net/Glyhj2
您可以进一步简化流程,但这是一般的想法。
然后,您可以在订单中为Order_attributes添加外键并使其唯一。