需要一个字段/标志/状态号码才能多次使用?

时间:2011-01-07 10:46:40

标签: database database-design

我想在我的数据库中创建一个易于查询的字段。

我想如果我给出一些背景知识,那就更有意义了。我的表格列在我的网站上。我运行一个程序,查看列表,决定是否隐藏它们在网站上显示。我还出于各种原因手动隐藏列表。

我想将这些原因存储在一个字段中,因此可以隐藏多个原因。

所以我需要某种形式的逻辑来确定使用了哪些原因。

任何人都可以向我提供任何指导,说明将来会出现什么样的新原因,以及哪些内容可以快速轻松地查询?

3 个答案:

答案 0 :(得分:2)

你说

  

一个列表有很多隐藏的理由

你实现“一对多”的关系,通过给“很多” - 一个外键指向你“一”方面的一行。在这种情况下,这将意味着两个表:

listing
reason_to_hide_listing

列表可能有一个id(int)和一些文本(text)。

reason_to_hide_listing将拥有自己的id(int),一个名为listing_id(int)的外键列,以及一个名为reason(text)的列。

要查看列表是否隐藏,请查询表reason_to_hide_listing以获取与您要显示的列表相同的listing_id(如果您应该显示)。如果一行或多行返回,则不应显示此列表。

SELECT COUNT(*) FROM reason_to_hide_listing WHERE listing_id = ?;

要找出未显示一个列表的所有原因,请从表reason_to_hide_listing中选择原因,其中外键是手头列表的ID。

SELECT reason FROM reason_to_hide_listing WHERE listing_id = ?;

隐藏列表,同时添加隐藏原因的原因,只需在reason_to_hide_listing中插入一个新行,其中listing_id指向您要隐藏的列表。

INSERT INTO reason_to_hide_listing(listing_id, reason) VALUES(?, ?);

答案 1 :(得分:1)

如果你想让一个用户(例如,你自己:))想出自己的理由,可以在你的表中添加一个varchar(255)可空字段来存储原因,然后在表中查询你的表使用where hide_reason is null或其他东西。

如果您希望通过更改表格定义偶尔更改一些固定的原因,请使用ENUM字段:http://dev.mysql.com/doc/refman/5.0/en/enum.html。 (我不知道你正在使用哪个数据库,所以我将使用我最喜欢的数据库)

如果你想要一些固定的理由,你可以不费力地改变,并且你可以在下拉列表中显示供用户选择,@ davogotland的解决方案确实是最好的。在数据库环境中添加表并不过分;)

在任何情况下,为了清晰起见,您总是可以选择在is_hidden字段旁边使用单独的hide_reason字段,或者因为您想要记住隐藏字段的人隐藏字段的原因再一次,等等。如果您这样做,请使用BIT / boolean / TINYINT字段。

编辑:

啊,等等。我误解了上面的答案。您需要一组固定的原因,并希望每个列表都有多个原因。这意味着您处于多对多的情况下(每个列表可能有多个原因,并且每个原因都可以分配给多个列表)。我知道有三种方法可以做到这一点:

  1. 您在上面概述的方式。使用“位”或2的幂。很棒。
  2. 使用SET数据类型,类似于ENUM但可能包含多个值。见:http://dev.mysql.com/doc/refman/5.0/en/set.html。如果您正在使用MS Access,则有一个“查找向导”数据类型,它似乎做了类似的事情(并且据说包括一个实际的查找向导)。
  3. 使用链接表,将列表链接到原因。您需要2个新表reasonslistings_reasons,如下所示:
  4. 原因:

    reason_id
    reason_text
    

    listings_reasons:

    listing_id
    reason_id
    

    现在,填写您的reasons表格可能的原因,并使用listings_reasons表格将它们链接到列表。这是最常见的解决方案,因为它允许您在不修改数据库结构的情况下添加可能的原因。

    祝你好运!

答案 2 :(得分:0)

您可以使用枚举类型作为位标志,并将值存储为数据库中的int。然后你只需要一个表来存储int和相关页面的FK。

[Flags]
enum HideReasons {
    None = 0x0,
    SomeReason = 0x1,
    OtherReason = 0x2
}

page.ReasonsToHide = HideReasons.SomeReason | HideReasons.OtherReason;

编辑:刚刚意识到你可能没有使用C#。希望这无论如何都有帮助。