在我正在开发的数据访问层中,我使用的是Mongo DB C# Driver.
我见过:
>名为“ID”的属性将由C#驱动程序映射为数据库的“_id”(约定优于配置);
> MongoDB is not a good idea中的Int自动递增;
>在MongoDB isn’t a good idea either中使用Guid作为ID;
> MongoDB中存储的文档ID的推荐数据类型是ObjectID
.C#驱动程序提供了一个表示此类的类;
>但是,如果我在我的模型中使用此数据类型(来自MongoDB.Bson),那么它们将依赖于MongoDB C#驱动程序而我不希望这样:我希望我的模型与数据库无关;只有我的DAL可以依赖于我使用的任何数据访问技术.
那么我应该将哪种数据类型用于我的POCO ID以保证数据库中的唯一性? Guid的字符串表示在性能方面是否可怕?
欢迎您的反馈.
解决方法
根据经验,我可以说你是对的:GUID和自动增量都不是最好的主意(GUID比自动增量好很多),但不仅仅是因为你链接的SO问题中提到的原因但是,主要是因为您需要了解单调与非单调键的含义.
使用ObjectIds,我看到三个选项:
>域模型和DAL之间的映射.在域模型中,您可以使用objectid的字符串表示.这有点烦人,但它迫使你分离关注点.>使用您自己的数据类型并实现类型转换器/ mongodb序列化程序.我没试过,但我不明白为什么这不起作用.>接受MongoDB依赖项.毕竟,如果你真的换掉了你的数据库,那将是一项艰巨的任务.不同的数据库具有非常不同的特征,并且需要非常不同的数在一分钟内整个“交换数据库”是虚假的恕我直言,它从来没有那么容易,数据库是一个比任何人都想承认的更漏洞的抽象.试图保持独立是PITA.无论如何,对ObjectId这个词进行搜索和破坏将不到其他工作的1%.