4


7

ソーシャルネットワークタイプのアプリケーションを構築するためのパターン?

Webベースのソーシャルネットワークタイプのアプリケーションを設計/設計/開発する必要があります。

基本機能:+ - ユーザーはシステムにアカウントを作成します+ - ユーザーはお互いに「友だち」になることに同意します+ - ユーザーはシステム内でコンテンツを作成します+ - ユーザーは、作成したコンテンツを表示/編集できる友達を指定します

確かにこのコア機能は何度も作成されていますか? この種のことを実装するためのベストプラクティスパターンはありますか?

私はこのためのデータベースがどのように見えるかに最も興味があります。

これは、SQLの観点(データベース)からどのように見えますか? + NOSQLの観点(どのNOSQLデータベース)からもこれはどのように見えますか?

私が最も興味を持っているのは、データベース内で「コンテンツの可視性」の問題をどのように解決するかです。 i.e. データベース/アプリケーションは、承認された友人のみがユーザーが作成したコンテンツを見ることができることをどのように保証しますか?

ありがとう

7 Answer


2


最初に問題を解決するのはデータベースです。SQLデータベースは正規化されたSQLデータベースのように見えます。 他にどのように見えるでしょうか? nosqlデータベースは、名前と値のペアファイルの束のように見えます。

ソーシャルWebサイトを構築するための3つのアプローチは、既存の人気のあるものと人気のないもののアーキテクチャを調査し、対象とする市場、およびこれらの市場に提供する特定のサービスを確認するために大量の研究を行った後のみです。

  1. 独自にゼロからロールします(またはフレームワークを使用します)。 Facebookのように、 Beebo、Myspaceなど。 これは明らかにそこに到達するまでの最も長いルートですが、それはあなたがするときに売るべきものがあることを意味します。 プラットフォームとメンバーシップ、およびUSPの両方が、Rupert Murdochまたは誰にでも販売するためのものです。

  2. ソーシャルサイトに適したCMSを使用し、基本的な 機能に加えて、プラグインに加えて、ターゲット市場にヒットするための独自のインスピレーション。 この分野では、Drupalがよく使用されます(私も正常に使用しました)が、Joomla、Xaraya、およびその他の多くの無料および有料の両方を使用できます。 さらに研究。 ベースツールはおそらくGPLであるため、Rupertがベルを与えると、ここで売ることは少なくなります

  3. サインアップしてから提供されているシステムのいずれかを使用してから、 独自のツールを構築するためのツールがすべて提供されますが、これらはホワイトラベルサイトと呼ばれます。 http://www.web-strategist.com/blog/2007/02/12/list-of-white-label-social-networking-platforms/ [ここから開始] ここでは、誰かがあなたを引き継ぐことを望んでいる場合、ほとんど売ることができません。

「コンテンツの可視性」の処理方法。 もちろん、最初にサイトビルダーがコンテンツを閲覧できるユーザーを決定します。 所有者のみ、友人、登録ユーザー、一般大衆? etc. ただし、この決定は、サイトの目的とポリシーに従って行わなければなりません。 これを処理する最良の方法は、RBAC http://en.wikipedia.org/wiki/Role-based_access_control [詳細についてはこちらをご覧ください]

あなたが「デザイン/建築家/開発する必要がある」と言うとき、それは圧倒的な内なる衝動のためか、誰かがあなたにお金を払っているからですか?

いずれにしても、ソーシャルWebスペースは非常に混雑していることを覚えておいてください。 別のYouTubeまたはFaceBookを構築しているだけの場合、そのようなサイトを商業的に成功させるために必要な数のクリティカルマスを生成することはできません。

まだ対応していないニッチ市場向けの場合 「Peckham and Brockley Exotic Bird Fanciers Club」では、市場が何であるか、どの機能が必要かがわかるので、最も簡単で安価と思われる上記のオプションを使用できますが、分析と実行はユーザー次第です。

もちろん、他のサイトでカバーされていない、メインストリームであるソーシャルサイトのアイデアがあるかもしれません。 神話の「市場のギャップ」を発見しました。 この場合、それのために行きますが、失望する準備をします。 か否か。


2


設計は保守可能でなければなりません。 これが私のプロジェクトにあるものです。

1.)* Application.Infrastructure *

  • すべてのビジネスオブジェクトのベースクラス、ビジネスオブジェクトコレクション、 データアクセスクラスと、拡張メソッドとしてのカスタム属性とユーティリティ、汎用検証フレームワーク。 これにより、最終的な.netアプリケーションの全体的な動作編成が決まります。

2.)* Application.DataModel *

  • データベースの型指定されたデータセット。

  • トランザクションおよびその他の機能を組み込むために拡張されたTableAdapters 必要かもしれません。

3.)* Application.DataAccess *

  • データアクセスクラス。

  • 基になるTypedを使用してデータベースアクションがクエリされる実際の場所 データセット。

4.)* Application.DomainObjects *

  • ビジネスオブジェクトとビジネスオブジェクトコレクション。

  • 列挙型

5.)* Application.BusinessLayer *

  • プレゼンテーション層からアクセス可能なマネージャークラスを提供します。

  • HttpHandlers。

  • 私自身のページ基本クラス。

  • ここにもっと行く

6.)* Application.WebClient または Application.WindowsClient *

  • 私のプレゼンテーション層

  • Application.BusinessLayerから参照を取得し、 Application.BusinessObjects。

Application.BusinessObjectsはアプリケーション全体で使用され、必要に応じてすべてのレイヤーを移動します(Application.DataModelおよびApplication.Infrastructureを除く)

すべてのクエリはApplication.DataModelのみで定義されています。

Application.DataAccessは、データアクセス操作の一部としてビジネスオブジェクトを返すか、受け取ります。 ビジネスオブジェクトは、リフレクション属性を使用して作成されます。 各ビジネスオブジェクトには、データベース内のターゲットテーブルへの属性マッピングがマークされ、ビジネスオブジェクト内のプロパティには、各データベーステーブル内のターゲット列への属性マッピングがマークされます。

検証フレームワークでは、指定されたValidationAttributeを使用して各フィールドを検証できます。

私のフレームワークでは、属性を多用して、マッピングや検証などの退屈なタスクのほとんどを自動化します。 また、フレームワークの新しい側面として新機能を追加できます。

私のアプリケーションでは、サンプルのビジネスオブジェクトは次のようになります。

  • User.cs *

[TableMapping("Users")]
public class User : EntityBase
{
    #region Constructor(s)
    public AppUser()
    {
        BookCollection = new BookCollection();
    }
    #endregion

    #region Properties

    #region Default Properties - Direct Field Mapping using DataFieldMappingAttribute

    private System.Int32 _UserId;

    private System.String _FirstName;
    private System.String _LastName;
    private System.String _UserName;
    private System.Boolean _IsActive;

    [DataFieldMapping("UserID")]
    [DataObjectFieldAttribute(true, true, false)]
    [NotNullOrEmpty(Message = "UserID From Users Table Is Required.")]
    public override int Id
    {
        get
        {
            return _UserId;
        }
        set
        {
            _UserId = value;
        }
    }

    [DataFieldMapping("UserName")]
    [Searchable]
    [NotNullOrEmpty(Message = "Username Is Required.")]
    public string UserName
    {
        get
        {
            return _UserName;
        }
        set
        {
            _UserName = value;
        }
    }

    [DataFieldMapping("FirstName")]
    [Searchable]
    public string FirstName
    {
        get
        {
            return _FirstName;
        }
        set
        {
            _FirstName = value;
        }
    }

    [DataFieldMapping("LastName")]
    [Searchable]
    public string LastName
    {
        get
        {
            return _LastName;
        }
        set
        {
            _LastName = value;
        }
    }

    [DataFieldMapping("IsActive")]
    public bool IsActive
    {
        get
        {
            return _IsActive;
        }
        set
        {
            _IsActive = value;
        }
    }

    #region One-To-Many Mappings
    public BookCollection Books { get; set; }

    #endregion

    #region Derived Properties
    public string FullName { get { return this.FirstName + " " + this.LastName; } }

    #endregion

    #endregion

    public override bool Validate()
    {
        bool baseValid = base.Validate();
        bool localValid = Books.Validate();
        return baseValid && localValid;
    }
}
  • BookCollection.cs *

///
/// The BookCollection class is designed to work with lists of instances of Book.
///
public class BookCollection : EntityCollectionBase
{
    ///
    /// Initializes a new instance of the BookCollection class.
    ///
    public BookCollection()
    {
    }

    ///
    /// Initializes a new instance of the BookCollection class.
    ///
    public BookCollection (IList initialList)
        : base(initialList)
    {
    }
}


0


まず、既存のソーシャルネットワーク(Facebook、Myspaceなど)を調べる必要があります。 それらの実装方法については、かなりの量の情報が利用可能です。


0


ソーシャルネットワークの成功の鍵は、それが基盤としているテクノロジーではなく、ユーザーのために解決する問題です。 ユーザーがそれを好めば、たとえあなたのテクノロジーがくだらないとしても、あなたは成功する運命にあります。

[EDIT] How is it implemented? Check any SQL-based user role system. In この場合、すべてのユーザーは、任意のオブジェクトに「アクセスを許可」として追加できるロールでもあります。 所有するオブジェクトの数とコントロールの粒度に応じて、3つの列を持つテーブルがあることを意味する場合があります。 (友人)、 WRITE(親しい友人)。

このテーブルはかなり大きくなりますが、今日のデータベースでは数億行はもう珍しくありません。


0


Aaroonが指摘したように、まずどの問題を解決したいかを自問する必要があります。

どのようなコンテンツを人々に共有してほしいですか? 本当に友達だけに見えるべきですか? 表示されるコンテンツは誰がページを視聴しているかに依存せず、簡単にキャッシュできるため、コンテンツを一般公開する方がはるかに簡単でスケーラブルです。 公開されているユーザー生成コンテンツは、新しいユーザーを引き付けます。

アクセスを制限し、ユーザーに友人のグループをリソースにアタッチする機会を与えたい場合、単純なグループベースのアクセス制御を使用します。 各リソースに、リソースを編集できるユーザーのグループと、リソースを表示できるユーザーのグループを持たせます。

そのようにして、各リソースには2つの単一値属性があり、各ユーザーは有限数のグループに属します。 NOSQLデータベース、Lucene / Sphinxなどの検索エンジン、またはSQLデータベースの行に格納されているドキュメントに、view-group属性とedit-group属性を添付できます。 ユーザーが利用できるコンテンツをクエリするとき、ユーザーが属するすべてのグループを渡します(SQLでは、Sphinxの `setFilter( 'view-group'、array(2,3,4))`で、 `IN`句を使用します。 データベースは、ユーザーが利用できるコンテンツのみを返します。 2つの整数値(view-groupおよびedit-group)のみをドキュメントに添付するため、それらをメモリに保存して、検索を高速かつスケーラブルにすることができます。


0


最終的には、ElggまたはDolphinが要件を満たす可能性があるようです。 これらは、独自のソーシャルネットワークを展開するためのPHPフレームワークのようです。 私はFacebookプラットフォームを見ましたが、それが何であるかを明確に説明していませんでした-それはFacebookのコードのように見えますが、おそらくアドオンAPIなどのコードにすぎません。