4

我对数据库设计非常陌生,并且我从客户那里得到了相当高的订单,他们的数据中有一些非常复杂的关系。我正在尝试做的是根据客户的条件编写推荐产品的逻辑。但是,根据各种其他数据位的值,需要应用一些有趣的过滤器。例如,某些产品仅适用于 {men|women},因此根据 say 的值customers.customer_gender不推荐该产品。

当然,我可以在 PHP 中完成这一切,但如果我可以在数据库中表示它并让它们成为它的表单接口,那就更好了。这样他们就可以在添加新产品时自定义和修改这些关系,而无需重新雇用我来自定义代码!那么,我的问题是缺乏经验。我不清楚我应该如何在表格中表示这些信息。

编辑1——尝试一个例子

假设您有以下表格:

顾客

id   name      gender
--   ----      ------
 1   Bob       male
 2   Mary      female
 3   Steve     male

健康)状况

id    name
--    ----
 1    Headaches
 2    Allergies
 3    Low Energy

产品

id    name              description
--    ----              -----------
 1    Product A         anti-allergy
 2    Product B         energy booster
 3    Product C         pain reliever

以及一些使用外键定义它们之间关系的进一步表,例如在什么条件下推荐什么产品(连接产品 id 和条件 id 的两列表),以及什么客户有什么条件。

现在,例如,我有一些只能推荐给男性的产品。或仅适用于对咖啡因不敏感的人。或者谁有某种严重程度的某种条件(其中严重程度是表中连接客户和条件的附加列,包含 1-3 的 int 值)。如何在纯数据库表中表示这些类型的关系(“为条件 Y 推荐产品 X,表达式 Z 除外”)?

4

3 回答 3

1

你可以用这样的模型解决这个问题:

ERD

有两个关键要素可以帮助您解决设计问题。

  1. 有表格来指示产品何时适用以及产品何时不适用的规则。

  2. CONDITION表格中包括任何可能涉及赞成或反对规则的情况。

例如:“有子宫”的患者禁用伟哥。

CONDITION_SEVERITY意味着患者有这种情况,它还允许您记录您需要使用的任何等级的分数,以说明病情有多严重。INDICATIONS您可以在和表中使用类似的严重性分数CONTRAINDICATIONS来表示产品仅在条件至少如此糟糕时适用,或者如果条件如此糟糕或更糟则不应使用。

于 2012-06-24T12:43:18.073 回答
0

您的标题的答案是肯定的这永远不是必需的。如果您想制作一个可扩展的条件列表,您可以在静态表结构中定义它。考虑这样的事情。

  1. 客户表:id、name 等

  2. 产品表:id、product_name 等

  3. 属性表:id、年龄、性别等

  4. 属性值表:id、attribute_id(指向属性的外键链接)、值

  5. 客户属性表:id、customer_id(FK to customers)、attribute_id(FK to attributes

  6. 推荐表:id、attribute_id(FK to attributes)、attribute_value_id(FK to attribute values)、product_id(FK to products

这里#6 将是你推荐引擎的核心,将给定的属性链接到给定的产品。

这只是一个示例,但我的意思是,您可以创建一个干净的、完全可扩展的静态数据库结构;无需求助于动态表和列名之类的疯狂。

于 2012-06-23T05:25:44.747 回答
0

考虑这个设计:

  • 用户(用户 ID PK)
  • 药物(MedicationID PK)
  • 症状(症状 ID PK)
  • 严重性(SeverityID PK)
  • 治疗(TreatmentID PK)

示例数据

用户

UserID    Username          
1         john.smith   
2         jane.doe
3         bob.jones

药物

MedicationID    Name
1               Tylenol
2               Excedrin
3               Morphine
4               Midol
5               Tums
6               Pepto
7               Anzemet

症状

SymptomID   Name          
1           Headache        
2           Cramps   
3           Vomiting       
4           Dizziness

严重性

SeverityID   Name 
1            Feels bad
2            Feels really bad
3            I want to die

治疗

TreatmentID  SymptomID    SeverityID   MedicationID
1            1            1            1
2            1            2            2
3            1            3            3
4            2            1            1
5            2            2            4
6            2            3            2
7            3            1            5
8            3            2            6
9            3            3            7

使用上面的数据User可以进来说,我头疼(SymptomID of 1),严重程度为2。那会建议吃药Excedrin

治疗表可以根据症状和严重程度建议药物。

SELECT m.Name AS MedicationName
      ,sy.Name AS SymptomName
      ,sev.Description AS SeverityDescription
FROM Treatments AS t
INNER JOIN Medication AS m
  ON t.MedicationID = m.MedicationID
INNER JOIN Symptoms AS sy
  ON t.SymptomID = sy.SymptomID
INNER JOIN Severity AS sev 
 ON t.SeverityID AS sev.SeverityID 
于 2012-06-23T05:26:04.943 回答