如何为具有不同产品参数的订单设计表层次结构

时间:2016-10-23 12:34:53

标签: sql database-design

我研究了提到的5种方法here

我仍然无法找到一个实现我正在创建的新数据库设计。上述每种方式都有它的优点和缺点,缺点不适合我的需要。

我将简要解释我需要什么。 我的公司有各个部门,每个部门都有类别(我只是列举一些例子):

  1. 视频修改(VE) cat 1 :活动 cat 2 :剪辑 cat 3 :生产

  2. 平面设计(GD) cat 1 :数码相册 cat 2 :照片处理 cat 3 :照片修饰

  3. 如您所见,每种产品都有完全不同的属性。

    截至目前,我为每个部门都有一个Excel文件,其中每个文件都有所有客户的标签(这就是我制作数据库的原因)。

    现在,在我的网站上,每个类别都有一个ORDER FORM,专为该类别中的属性设计。我在将这个实现到ORDERS表层次结构中时遇到了麻烦。

    正如你在我的截图中看到的那样(不介意命名......我使用了“属性”,所以你可以看到它是什么。我将把它改为“att”。我也刚刚制作一些用于测试的基本列)当客户从这些类别订购产品时,四个权利表就是今天的订单形式。因此,如果您考虑一下,它们应该是与ORDER_DETAIL表的一对一关系(就像我在屏幕截图中对其中一个做的那样),因为您在订单中只能有一行。但我想到的一个问题是名称“order_detailsID”不匹配,我已经知道关系键应该具有相同的名称......我不能将属性表的PK命名为“order_detailsID”,因为那不是什么它是...它的属性。

    也许我的ORDERS和ORDERS_DETAILS错了......我不知道。我需要帮助来弄清楚如何让客户能够订购产品并基于此,获得适当的属性表来填写一行。

    (当然,att表中的FK“order_detailsID”字段未被使用,因为我不知道是否需要它们。)

    你会建议什么?

    点击HERE获取较大的原始质量屏幕截图。

    enter image description here

1 个答案:

答案 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添加外键并使其唯一。