我有一个 MySQL 数据库,其中包含 Items
和 Stores
表,以及一个查找表 ItemStores
,如下所示:
CREATE TABLE IF NOT EXISTS Items (
itemId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
description VARCHAR(256) NOT NULL DEFAULT '',
priceBeforeTax DECIMAL(10,2) NOT NULL,
) DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE TABLE IF NOT EXISTS Stores (
storeId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
storeName VARCHAR(128) NOT NULL,
) DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE TABLE IF NOT EXISTS ItemStores (
storeId INT NOT NULL REFERENCES Stores(storeId),
itemId INT NOT NULL REFERENCES Items(itemId),
quantity INT NOT NULL
) DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
应用程序将 Items 和 Stores 存储在 Item
和 Store
对象的 ObservableCollections
中,一些 WPF 控件绑定(bind)到这些 ObservableCollections
,像这样:
public class Store
{
public int storeId { get; set; }
public string storeName { get; set; }
public override string ToString()
{
return this.branchName;
}
}
private static ObservableCollection<Store> _stores = new ObservableCollection<Store>();
public static ObservableCollection<Store> Stores
{
get { return _stores; }
}
public class Item
{
public int itemId { get; set; }
public string description { get; set; }
public decimal priceBeforeTax { get; set; }
public override string ToString()
{
return this.description;
}
}
private static ObservableCollection<Item> _items = new ObservableCollection<Item>();
public static ObservableCollection<Item> Items
{
get { return _items; }
}
现在我的难题集中在如何分配 ItemStores
数据上。我正在考虑在每个 Item
中有一个哈希表,将 storeID
映射到每个 Store
中的项目数量。有没有更好的方法来映射它,假设我偶尔会通过 itemId
搜索 Item
?我已经在运行 SELECT * FROM Items
来填充 ObservableCollection,我担心运行另一个查询以从每个商店获取数量会真正打击 MySQL。 JOIN
无济于事,因为我不知道将返回多少家商店,并且为同一商品返回多行(每个商店携带它的一行)将使放置数据放入 ObservableCollection。
最佳答案
我不会走那条路。您很快就会发现自己正在构建一个 ORM,而不是使用一个。此外,将整个数据库读入内存集合不是一个好主意,因为一旦您意识到数据已过时并开始重新加载所有内容,这将成为性能问题。
至于原始问题,ORM 类将相关子项的集合作为属性,因此您不必搜索所有子项 - 您将找到一个 Store 并读取所有 ItemStore 对象。如果您需要所有商店的商品 list ,您将向数据库请求该信息。
关于c# - 如何组织数据库中的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9659631/