1

我有一个应用程序,它通过Product模型和表格存储产品数据。每个产品都有特定的状态可用性(多个状态),我将来需要过滤和/或搜索。我希望找到能告诉我存储这些数据的最有效方法的人。在我看来,我有两个选择。

第一个是在我的表中简单地创建 50 列,标题为每个州名并包含一个布尔值。然后我可以简单地过滤= "avail in California" if product.ca。虽然这确实有效,但似乎有点麻烦,尤其是在搜索多状态可用性时。

第二种选择是简单地拥有一个存储可用状态数组的列(“状态”),然后按= "avail in California" if product.states.include? "CA". 出于两个原因,这似乎是一个更好的解决方案。首先,它只允许一个更干净的数据库表。其次,更重要的是,我可以允许我的用户通过简单地将用户的输入保存为变量(user_input)然后= "avail in California" if product.states.include? user_input. 这个解决方案确实需要更多的工作,但是当将产品保存在数据库中时,因为我不能简单地检查一个布尔值。

我认为选项二最有意义,但我希望就为什么或为什么不提供一些建议。我发现了一些类似的问题,但它们似乎并没有解释哪种解决方案会更好,只是如何完成每个问题。

我应该怎么办?

4

2 回答 2

3

除非您有充分的理由不这样做,否则您应该规范化,而且我在您的概述中没有看到。

要规范化,您应该有以下表格:

  1. product表,每个产品一条记录
  2. state表,每个状态一条记录
  3. product_state表,每个处于状态的产品都有一个条目

product_state架构如下所示:

(product_state_id PK, product_id FK, state_id FK)
UNIQUE INDEX(product_id,state_id);

这允许您拥有零个或多个状态的产品。

于 2013-08-27T18:09:59.440 回答
0

我假设由于您在销售产品,因此您将收取税款。州、县、市有不同的税收。有些国家也有国家税。

因此,您需要将这些实体抽象为一个共同的父对象,通常称为GeopoliticalArea,以便您可以将单个外键(例如,来自税率表)指向任何子类型。

create table geopolitical_area (
  id bigint primary key,
  type text not null
);

create table country (
  id bigint primary key references geopolitical_area(id),
  name text not null unique
);

-- represents states/provinces:
create table region (
  id bigint primary key references geopolitical_area(id),
  name text not null,
  country_id bigint references country(id),
  unique (name, country_id)
);
insert into geopolitical_area values 
(1, 'Country'),
(2, 'Region');

insert into country values 
(1, 'United States of America');

insert into region values 
(2, 'Alabama', 1);
于 2013-08-27T18:41:06.193 回答