什么时候可以模糊数据和逻辑之间的抽象?

时间:2011-10-06 16:22:05

标签: database coupling

我的意思是通过ID,代码或在数据库中指定类名来引用特定的数据库行。例如:

您有一个名为SocialNetwork的数据库表。这是一个查找表。应用程序不会写入或删除它。它主要用于数据库完整性;让我们说整个shebang看起来像这样:

SocialNetwork table:

Id | Description
-----------------------------
1  | Facebook
2  | Twitter

SocialNetworkUserName table:

Id | SocialNetworkId | Name
---------------------------------------------------
1  | 2               | @seanssean
2  | 1               | SeanM

在您的代码中,需要为Facebook用户执行一些特殊逻辑。我通常做的是在代码中创建一个枚举或一些类常量来轻松引用它,如:

if (socailNetwork.Id == SocialNetwork.FACEBOOK ) // SocialNetwork.FACEBOOK = 1
  // special facebook-specific functionality here

这是一个硬编码的数据库ID。这不是一个巨大的犯罪,因为它只是引用一个查找表,但不再是数据和逻辑之间的清晰划分,这让我感到困扰。

我能想到的另一个选择是在数据库中指定一个类或委托的名称,但这更糟糕的是IMO,因为现在你不仅打破了数据和逻辑之间的区别,而且你已经并列你现在用一种语言。

我是无所事事吗?

2 个答案:

答案 0 :(得分:1)

是的,但需要注意“这取决于”。它不太可能改变,但是。

存储类或委托的名称可能不好,但是存储类或委托 factory 所使用的令牌不是,因为它是语言中立的 - 但是你总会有必须维护连接某处的问题。除非你有一个与 表相关的语言特定事项表,否则我相信你会被枪杀。

不是在主线代码中保持不变的比较,IMO这种情况对于工厂/等是好的。模式,枚举查找等,以实现特定于网络的类查找/行为。主线代码不应该关心它是如何实现的,它现在就做了 - 部分是一个真正的问题。

随着警告,最终它可能从不重要。如果是我,我至少会解决主线代码问题,因为这样的东西会让我感到抽搐。

答案 1 :(得分:1)

我没有看到问题。

在某些时候,您的代码需要做一些事情。 Facebook是一个真正的社交网络,拥有自己的真正的API,你希望它在你的代码中做特定于Facebook的事情。除非您的任务微不足道,否则将所有特定于Facebook的内容放入数据库中将意味着代码中的头痛。 (例如,Twitter中的“赞”等于什么?)

如果Facebook条目不在您的数据库中,则不会执行特定于Facebook的代码。你可以做那么多。