如何处理(country-)代码列表中的弃用值

sve*_*vit 2 .net c# vb.net database-design

假设我们有所有国家/地区的代码列表,包括其国家/地区代码.国家/地区代码是Countries表的主键,它在数据库的许多位置用作外键.在我的应用程序中,国家/地区通常显示为多个表单的下拉列表.

过去曾经存在的一些国家不再存在,例如塞尔维亚和黑山,其国家代码为SCG.

我有两个目标:

  • 不允许用户使用这些旧值(因此在插入数据时下拉列表中不应显示这些值)
  • 用户应该仍然能够(只读)打开旧的东西,在这种情况下,弃用的值应该在下拉列表中可见.

我看到两个选择:

  • 重命名已弃用的值,例如从"CountryName"重命名为"!!!!! CountryName".这种方法最容易实现,但有明显的缺点.
  • 将IsActive列添加到Countries表,并为所有已弃用的值设置为false,对所有其他值设置为true.在用户可以插入数据的所有表单上,仅显示活动的值.在只读表单上,我们可以显示所有值(包括已弃用的值),以便用户能够显示旧数据.但是在我的一些表单上,用户应该也能够编辑数据,这意味着应该向他隐藏已弃用的值.这意味着,每个Dropbox应该有一些这样的初始化逻辑:如果显示的数据是只读的,那么在dropbox中包含已弃用的值,如果数据也用于编辑,则排除它们.但这也是很多工作和错误.

和其他想法?

E.J*_*nan 6

我经常处理这个场景,并使用'Active'标志来解决问题,就像你描述的那样.当我使用值填充下拉列表时,我只加载"活动"数据并包含最多1个已弃用的值,但仅限于使用它.(即如果我正在查看个人记录,并且该人有一个已弃用的国家/地区,那么该国家/地区将与活动国家/地区一起包含在下拉列表中.我以只读和编辑模式执行此操作,因为在我的情况是,如果一个人记录(例如)列出了一个已弃用的国家,他们可以继续使用它,但一旦他们将其更改为一个未弃用的国家,然后保存它们,它们就永远不能切换回来(你的用例)可能会有所不同).

因此,关键区别在于,即使在只读模式下,我也不会将所有已弃用的国家/地区添加到DDL中,只是应用于我正在查看的记录的已弃用国家/地区,即便如此,只有该记录是已经在使用了.

以下是我在加载下拉列表时使用的逻辑示例:

    protected void LoadSourceDropdownList(bool AddingNewRecord, int ExistingCode)
    {
        using (Entities db = new Entities())
        {
            if (AddingNewRecord) // when we are adding a new record, only show 'active' items in the drop-downlist.
                ddlSource.DataSource = (from q in db.zLeadSources where (q.Active == true) select q);

            else // for existing records, show all active items AND the current value.
                ddlSource.DataSource = (from q in db.zLeadSources where ((q.Active == true) || (q.Code == ExistingCode)) select q);

            ddlSource.DataValueField = "Code";
            ddlSource.DataTextField = "Description";
            ddlSource.DataBind();

            ddlSource.Items.Insert(0, "--Select--");
            ddlSource.Items[0].Value = "0";
        }
    }
Run Code Online (Sandbox Code Playgroud)