我刚开始使用ASP.NET MVC试图首先理解这个哲学.我想我很清楚控制器和视图所扮演的角色,但我对模型部分有点困惑.一些消息来源说它的域模型,有人说它是数据模型,有些人说它是绑定到视图的对象.
恕我直言这些是非常不同的事情.所以,有人可以一劳永逸地清除这个吗?
我有三个表:用户,公司和网站.用户和公司拥有网站,因此每个用户记录都有一个外键进入网站表.此外,每个公司记录都有一个外键进入网站表.
现在我想将网站表中的外键包含回各自的"父"记录中.我怎么做?我应该在每个网站记录中有两个外键,其中一个永远是NULL吗?或者还有另一种方法吗?
我正在用PHP和MySQL创建一个多用户/公司Web应用程序.我很想知道构建数据库的最佳实践是什么.
这个网络应用程序将有数百家公司和数千名用户,因此需要强大.每家公司都无法看到其他公司的数据,只有他们自己的数据.我们将主要存储文本数据,每个公司可能只有几MB.
目前,该数据库包含14个表(对于一个样本公司).
将所有公司及其用户的数据放在一个数据库中并为每个公司创建一个唯一的公司ID更好吗?
要么:
是否更好地将每个公司的数据放在自己的数据库中,并为我添加的每个新公司创建一个新的数据库和表集?
每种方法的优点和缺点是什么?
谢谢,
斯蒂芬
我很少遇到这样的情况:多个实体类型的单个表似乎比每个实体类型一个表好.这是一个对我有意义的例子,但在学术上它似乎是错误的.
问题:我可以这样做并且仍然具有"声音"架构吗?
示例如下
假设有两种实体类型,一个公司和一个人.公司通常由一个人拥有,但有时另一家公司拥有公司.
坚持这一想法并加入其中,让我们说每个公司都有一个附属于它的注册代理人,负责公司的合法创建.进一步说明,注册代理人可以是个人或公司.
如果您认为公司[子女]的所有者[父母]可以是个人或公司,您可能会开始看到保持第三种正常形式并避免冗余的挑战.
与我的例子相反,如果只有人可以拥有公司,则所有权链接表非常传统,具有列:OwnershipID(有点不必要),CorporateID,PersonID.
相反,您需要以下内容:OwnershipID,CorporationID,OwnerID,OwnerEntityType(corp或person).不要误会我的意思,你可以做到这一点,但至少可以说它不会很有趣.
继续我给出的示例,您需要为每个公司分配代理.通常,代理人是所有者(一个人)之一.在这种情况下,您确实想要链接回该人的一条记录.您不希望将此人的记录作为所有者,然后再将其作为代理记录(在代理表中).这将是多余的.
与该"问题"类似,注册代理人也可以是公司,例如律师事务所,注册会计师或商业申请公司,以列举一些典型的例子.就像代理人一样,代理公司真的不应该作为代理人实体获得自己的记录.相反,它需要链接回公司表中的公司存在.[除了我最终说没有公司实体表]
就像链接表将每个公司与其所有类型,个人或公司的所有者相匹配一样,您可以拥有一个代理链接表:AgentRepresentationID,CorporationID,AgentID,AgentType ......但同样,它会很难看( IMO)当你必须把相关的代理 - 一些来自Person表,一些来自公司表.
这就是为什么我说,在这种情况下,你可以看到中性实体类型如何有利.它会是这样的:
表:EntityAll
键列:EntityID,EntityType(或EntityTypeID,如果您坚持,链接以获取描述),EntityName(有关于名称和不同类型的问题...关于此帖子的主题)
链接表:CorporationOwnership
Key Columns:OwnershipID(再次,我的评论,这是一种不必要的),ChildEntityID(被拥有的实体;为了清楚起见,命名为"Child",我不会将其命名为)ParentEntityID(父实体)
链接表:AgentRepresentation
键列:AgentRepresentationID(...我不会说出来),CorporationEntityID(正在表示的公司实体),AgentEntityID(来自Entity表,等于此处代理的记录)
虽然您对我的架构可能没问题,但您应该对链接表中的列命名感到困扰.这让我很烦.通常,这些表中的第二个和第三个列名称与每个实体的相应表中的JOIN列完全匹配(哈哈,但是每个实体都没有相应的表,因此您不能使链接表列名匹配源列名称,因为它们是相同的列).从技术上讲,这无关紧要,但它会破坏你的命名约定,这些约定很重要,但还不足以做到这一点.
如果我还没有把它推回家,那么你将如何把它拉到一起.您可以自己加入EntityAll表以获得所需内容.
列出所有军团及其所有者(在T-SQL中):
SELECT Corp.EntityName as CorpName, Owner.EntityName as OwnerName
FROM EntityAll as Corp
JOIN CorporationOwnership as Link on (Corp.EntityID = Link.ChildEntityID)
JOIN EntityAll as Owner on (Link.ParentEntityID = Owner.EntityID)
Run Code Online (Sandbox Code Playgroud)
因此,您可以执行相同的操作来返回代理,而不是所有者.
我意识到这不是我们如何训练构建表格,但我非常强烈地认为我的解决方案可以消除冗余数据并使代码,管理和读取变得更加容易.
PS我最近提供了这个例子作为SO的旧问题的答案.作为一个老问题,没有对话.我需要实现这个例子,我很好奇这个架构的后果.
以下是上一个问题/答案: 良好的数据库表设计:一个表混合不同的实体或每个实体的单独表
想象一下,您计划创建一个在GAE/Java上运行的社交网络,其中每个用户都有一组属性(即年龄,当前城镇,兴趣).
备选方案1:经典方法 - user_id和每个属性作为"行"
entity property_1 property_2 property_3
------ ---------- ---------- -----------------
bob missing NY [football, books]
tom 34 missing [books, horses]
Run Code Online (Sandbox Code Playgroud)
备选方案2:实体 - 分配值(EAV)
entity attribute value
------ --------- -----
bob town NY
bob interests [football, books]
tom age 34
tom interests [books, horses]
Run Code Online (Sandbox Code Playgroud)
您认为每个选项有哪些优缺点?我主要担心的是:
我认为第二种选择更灵活,也许更容易实现,但我想知道其他有经验的开发人员的想法.
谢谢.
我正在尝试设计一个"食谱盒"数据库,但我无法正确使用它.我不知道我是否走在正确的轨道上,但这就是我所拥有的.
食谱(recipeID等)
成分(成分
ID 等)recipeIngredient(recipeID,ingredientID,amount)
category(categoryID,name)
recipeCategory(recipeID,categoryID,name等)
所以我有几个问题.
谢谢您的帮助.
嗨伙计们:我想知道是否有人知道Clojure中DSL的具体示例,它取代了优秀OO程序的抽象和可读性(用Java编写).
我一直在尝试将一个OO数据模型(基于"bean",使用非常抽象的方法隐藏底层实现)变成一个clojure moeity ......
我知道存在"宏"和"高阶函数",但是,我从未将它们应用于易于理解的真实世界数据集(例如,课程注册系统,汽车经销商或计费)系统,或类似的东西,回想起Hibernate和Ibatis在过去十年中普及的臭名昭着的"JPetStore"例子.
无论如何......我的基本问题是:
是否存在任何特定于域的模板,用于学习如何使用协议和高阶函数对Clojure中的真实世界系统进行建模?
我正在尝试构建一个表来处理某个广告系列已使用以下模型关联设置的位置和类别:
class Campaign < ActiveRecord::Base
has_many :campaign_category_metro_bids, dependent: :destroy
has_many :metros, through: :campaign_category_metro_bids
has_many :categories, through: :campaign_category_metro_bids
end
class Metro < ActiveRecord::Base
has_many :campaign_category_metro_bids
has_many :campaigns, through: :campaign_category_metro_bids
has_many :categories, through: :campaign_category_metro_bids
end
class Category < ActiveRecord::Base
has_many :campaign_category_metro_bids
has_many :campaigns, through: :campaign_category_metro_bids
has_many :metros, through: :campaign_category_metro_bids
end
class CampaignCategoryMetroBid < ActiveRecord::Base
belongs_to :campaign
belongs_to :category
belongs_to :metro
end
Run Code Online (Sandbox Code Playgroud)
尝试创建用于选择两个不同城市和类别的广告系列时,其中一个参数的ID的结果为NULL:

广告系列制作代码
def new
if signed_in?
# create new campaign
@user = User.find(params[:id])
@campaign = @user.campaigns.new
else
redirect_to signin_path
end
end …Run Code Online (Sandbox Code Playgroud) activerecord ruby-on-rails data-modeling associations model-associations
我用Neo4j构建了一个社交网络,它包括:
节点标签:User,Post,Comment,Page,Group
关系:LIKE,WRITE,HAS,JOIN,FOLLOW,...
就像Facebook一样.
示例:A user关注B user:当B有诸如发布,评论,跟随其他用户,关注页面,加入组等操作时,将发送操作A.类似的,C,D,E随后用户B会收到相同的通知.
我不知道如何为这个问题设计数据模型,我有一些解决方案:
Notification为每个用户创建节点.如果执行了某个操作,请n为n关注者创建通知.好处:我们可以检查这个用户是否看过通知,对吧?但是,节点数量迅速增加,功率增加n.我希望事物(人,物体等)具有能力(跳跃,奔跑等)。我希望某些东西仅具有某些能力。这些是我当前的类型:
type Ability =
| Jump
| Stay
| Run
| Walk
type Person = {
abilities : Ability Set // OK, since a person should be able to do all of the above
}
type InanimateObject = {
abilities : Ability Set // Not OK, it should only be able to "Stay"
}
type ThingWithAbilities =
| Person of Person
| InanimateObject of InanimateObject
Run Code Online (Sandbox Code Playgroud)
我希望我的API的调用者能够要求ThingWithAbilities具有特定功能。示例:给我所有ThingWithAbilities具有“跳转”能力的对象。我怎样才能很好地建模呢?我想使不可能InanimateObject在代码中创建具有“跳转”功能的。
data-modeling ×10
mysql ×2
sql ×2
activerecord ×1
asp.net-mvc ×1
associations ×1
clojure ×1
database ×1
f# ×1
java ×1
multi-tenant ×1
neo4j ×1