覆盖db记录的模式

时间:2016-03-27 00:44:23

标签: c# sql-server design-patterns

我正在寻找一个模式或代码示例,用户可以在其中输入自己的记录,覆盖默认记录。

例如,Holiday表的默认记录可能是:

HolidayName  Holiday Date  CompanyId
-----------  ------------  ---------
New Year     01-Jan-2016   NULL
Day After    02-Jan-2016   NULL 

用户添加自己的假期后(对于CompanyId“1234”):

HolidayName  Holiday Date  CompanyId
-----------  ------------  ---------
New Year     01-Jan-2016   NULL
Day After    02-Jan-2016   NULL
Another Name 01-Jan-2016   1234
My Holiday   03-Jan-2016   1234 
Joes Holiday 04-Jan-2016   5678 

如何检索以下组合的假日列表:

  1. 默认假期(其中CompanyId = NULL)或
  2. 被覆盖的假期(日期相同),
  3. 并包含用户输入的其他假期(按CompanyID)。
  4. 像companyId = 1234这样:

    HolidayName  Holiday Date  CompanyId
    -----------  ------------  ---------
    Another Name 01-Jan-2016   1234
    Day After    02-Jan-2016   NULL
    My Holiday   03-Jan-2016   1234     
    

    不确定这是否可以在SQL视图,Query或C#代码中完成。

2 个答案:

答案 0 :(得分:1)

对于您的具体情况,您只需在日期进行完全加入(因为您只显示用户添加假期或重命名现有假期):

SELECT
     COALESCE(User.HolidayName, Default.HolidayName) as HolidayName,
     COALESCE(User.HolidayDate, Default.HolidayDate) as HolidayDate,
     User.CompanyId
FROM Holidays as User
FULL OUTER JOIN (
     SELECT * FROM Holidays WHERE CompanyId IS NULL
) as Default ON
     User.HolidayDate = Default.HolidayDate
WHERE
     User.CompanyId = 1234

但是,这并不允许用户删除假期。您可以通过创建带有IsDeleted标志的用户假期来解决这个问题 - 但我个人可能会选择初始化复制程序,这种程序会更简单,更灵活。如果你推出新的"默认"它确实需要一些合并代码。未来的假期,但这非常微不足道。

答案 1 :(得分:1)

似乎如果你将数据标准化得更多一点,它会有很大的帮助:

Table: Company
CompanyId
---------
1234
5678

Table: CompanyHoliday
Id CompanyId HolidayId
------------------------------------
1  1234      3
2  1234      4
3  5678      5

Table: Holiday
Id OccursOn   IsDefault Name
----------------------------------
1  01-01-2016 1         New Year
2  01-02-2016 1         Day After
3  01-01-2016 0         Another Name
4  01-03-2016 0         My Holiday
5  01-04-2016 0         Joes Holiday

然后提及Mark Brackett,当您创建新公司时,在CompanyHoliday表中为默认假期的新公司创建关联记录。