我有一个基于网络的跟踪应用程序,我将数据存储在SQL服务器中。我正在跟踪我已部署应用程序的位置。 Web界面是一个下拉组合,我现在有一个varchar(100)字段。我让用户选择一个下拉列表:
但现在我的应用程序存储在多个区域(但不一定是全局的)
我应该摆脱“全球”选项,只是在美国,欧洲和亚洲拥有一个多选领域。
我正在考虑查询此数据时的含义,因为我想对此数据进行切片和切块并运行查询以获取每个区域的指标等。
我存储这些数据的最佳方式是什么?
答案 0 :(得分:4)
如果现实生活中的数据是多对多的,那么我建议使用位置表,应用程序表和连接表。没有理由这会阻止您在数据上运行任何类型的查询。
答案 1 :(得分:4)
听起来像一个标准的多对多的东西。像:
+-------+ +-----------------+ +--------+
| App | | App_Region | | Region |
+-------+ +-----------------+ +--------+
| id PK |<--| app_id PK FK | ->| id PK |
| name | | region_id PK FK |/ | name |
+-------+ +-----------------+ +--------+
App_Region用作链接表,因此您可以将每个应用程序链接到多个区域。
答案 2 :(得分:1)
您没有说哪个版本的SQL Server。您是否考虑将您的广大地区映射到实际的地理区域?这样您就可以使用spatial features of SQL Server 2008,如果您稍后在定义位置时为用户添加更多详细信息,那么您的数据库和查询将更加有效。
答案 3 :(得分:1)
我会考虑创建一个region
表来保存全球,美国,欧洲,亚洲(以及任何未来的地区),然后创建一个region_application
,以便将应用程序链接到多个地区。由于所有内容都是基于索引的,因此您的查询应该可以很好地执行,并且您可以轻松地按区域对它们进行切片。
答案 4 :(得分:0)
答案 5 :(得分:-3)
如果您的区域数量很少(此处只有三个),您可以使用tinyint来存储值:
美国= 128, 欧洲= 64, 亚洲= 32
如果您正在使用C#,您还可以设置枚举来存储这些值
[Flags]
public enum Region: byte
{
America = 128,
Europe = 64,
Asia = 32,
Global = 224
}
对它们进行按位操作:
bool isInAmerica = (myValue & Region.America) == Region.America;
我认为你也可以在SQL Server中进行按位操作。